mirror of
				https://github.com/zenorogue/hyperrogue.git
				synced 2025-10-31 14:02:59 +00:00 
			
		
		
		
	improved ranged Orb error messages
This commit is contained in:
		
							
								
								
									
										181
									
								
								orbs.cpp
									
									
									
									
									
								
							
							
						
						
									
										181
									
								
								orbs.cpp
									
									
									
									
									
								
							| @@ -1244,6 +1244,8 @@ EX int check_vault(cell *cf, cell *ct, flagtype flags, cell*& jumpthru) { | |||||||
| EX eItem targetRangedOrb(cell *c, orbAction a) { | EX eItem targetRangedOrb(cell *c, orbAction a) { | ||||||
|  |  | ||||||
|   if(!haveRangedOrb()) { |   if(!haveRangedOrb()) { | ||||||
|  |     if(!isWeakCheck(a)) | ||||||
|  |       addMessage(XLAT("You have no ranged Orbs!")); | ||||||
|     return itNone; |     return itNone; | ||||||
|     } |     } | ||||||
|    |    | ||||||
| @@ -1251,7 +1253,7 @@ EX eItem targetRangedOrb(cell *c, orbAction a) { | |||||||
|     int r = rosemap[cwt.at]; |     int r = rosemap[cwt.at]; | ||||||
|     int r2 = rosemap[c]; |     int r2 = rosemap[c]; | ||||||
|     if(r2 <= r && !markOrb(itOrbBeauty)) { |     if(r2 <= r && !markOrb(itOrbBeauty)) { | ||||||
|       if(a == roKeyboard || a == roMouseForce )  |       if(a == roKeyboard || a == roMouseForce) | ||||||
|         addMessage(XLAT("Those roses smell too nicely. You can only target cells closer to them!")); |         addMessage(XLAT("Those roses smell too nicely. You can only target cells closer to them!")); | ||||||
|       return itNone; |       return itNone; | ||||||
|       } |       } | ||||||
| @@ -1275,14 +1277,20 @@ EX eItem targetRangedOrb(cell *c, orbAction a) { | |||||||
|     return itNone; |     return itNone; | ||||||
|     } |     } | ||||||
|    |    | ||||||
|  |   vector<string> orb_error_messages; | ||||||
|  |  | ||||||
|  |   #define CHKV(b, v) ((b) ? true : (v, false)) | ||||||
|  |   #define CHK(b, s) CHKV(b, orb_error_messages.push_back(s)) | ||||||
|  |  | ||||||
|   // (0-) strong wind |   // (0-) strong wind | ||||||
|   if(items[itStrongWind] && c->cpdist == 2 && cwt.at == whirlwind::jumpFromWhereTo(c, true)) { |   if(items[itStrongWind] | ||||||
|  |     && CHK(c->cpdist == 2 && cwt.at == whirlwind::jumpFromWhereTo(c, true), XLAT("Strong wind can only take you to a specific place!"))) { | ||||||
|     changes.init(isCheck(a)); |     changes.init(isCheck(a)); | ||||||
|     if(jumpTo(a, c, itStrongWind)) return itStrongWind; |     if(jumpTo(a, c, itStrongWind)) return itStrongWind; | ||||||
|     } |     } | ||||||
|    |    | ||||||
|   // (0x) control |   // (0x) control | ||||||
|   if(haveMount() && items[itOrbDomination] && dragon::whichturn != turncount) { |   if(items[itOrbDomination] && haveMount() && dragon::whichturn != turncount) { | ||||||
|     if(!isCheck(a)) {  |     if(!isCheck(a)) {  | ||||||
|       dragon::target = c; |       dragon::target = c; | ||||||
|       dragon::whichturn = turncount; |       dragon::whichturn = turncount; | ||||||
| @@ -1293,8 +1301,15 @@ EX eItem targetRangedOrb(cell *c, orbAction a) { | |||||||
|     } |     } | ||||||
|    |    | ||||||
|   // (0) telekinesis |   // (0) telekinesis | ||||||
|   if(c->item && !itemHiddenFromSight(c) && !cwt.at->item && items[itOrbSpace] >= fixpower(spacedrain(c).first) && !cantGetGrimoire(c, !isCheck(a)) |  | ||||||
|     && c->item != itBarrow) { |   if(items[itOrbSpace] | ||||||
|  |     && CHK(c->item && !itemHiddenFromSight(c), XLAT("%The1 can only be used on items!", itOrbSpace)) | ||||||
|  |     && CHK(!cwt.at->item, XLAT("Cannot use %the1 here!", itOrbSpace)) | ||||||
|  |     && CHK(!saved_tortoise_on(c), XLAT("No, that would be heartless!")) | ||||||
|  |     && CHK(items[itOrbSpace] >= fixpower(spacedrain(c).first), XLAT("Not enough power for telekinesis!")) | ||||||
|  |     && CHK(!cantGetGrimoire(c, !isCheck(a)), XLAT("Cannot use %the1 here!", itOrbSpace)) | ||||||
|  |     && CHK(c->item != itBarrow, XLAT("%The1 is protected from this kind of magic!", c->item)) | ||||||
|  |     ) { | ||||||
|     if(!isCheck(a)) { |     if(!isCheck(a)) { | ||||||
|       bool saf = c->item == itOrbSafety; |       bool saf = c->item == itOrbSafety; | ||||||
|       telekinesis(c); |       telekinesis(c); | ||||||
| @@ -1304,11 +1319,14 @@ EX eItem targetRangedOrb(cell *c, orbAction a) { | |||||||
|     } |     } | ||||||
|    |    | ||||||
|   // (0') air blow |   // (0') air blow | ||||||
|   bool nowhereToBlow = false; |   if(items[itOrbAir] | ||||||
|   if(items[itOrbAir] && (isBlowableMonster(c->monst) || isPushable(c->wall) || c->wall == waBigStatue || isBoat(c))) { |     && CHK(isBlowableMonster(c->monst) || isPushable(c->wall) || c->wall == waBigStatue || isBoat(c), | ||||||
|  |         c->monst ? XLAT("%The1 is immune to wind!", c->monst) : XLAT("Nothing to blow here!")) | ||||||
|  |     ) { | ||||||
|     int di = NODIR; |     int di = NODIR; | ||||||
|     movei mi = blowoff_destination(c, di); |     movei mi = blowoff_destination(c, di); | ||||||
|     auto& c2 = mi.t; |     auto& c2 = mi.t; | ||||||
|  |     bool nowhereToBlow = false; | ||||||
|     if(!mi.op()) nowhereToBlow = true; |     if(!mi.op()) nowhereToBlow = true; | ||||||
|     else if(isBoat(c) && !isWatery(c2) && c2->wall != waNone) nowhereToBlow = true; |     else if(isBoat(c) && !isWatery(c2) && c2->wall != waNone) nowhereToBlow = true; | ||||||
|     else if(c->wall == waBigStatue && !canPushStatueOn(c2, P_BLOW)) nowhereToBlow = true; |     else if(c->wall == waBigStatue && !canPushStatueOn(c2, P_BLOW)) nowhereToBlow = true; | ||||||
| @@ -1316,35 +1334,39 @@ EX eItem targetRangedOrb(cell *c, orbAction a) { | |||||||
|       if(!isCheck(a)) blowoff(mi), apply_impact(c); |       if(!isCheck(a)) blowoff(mi), apply_impact(c); | ||||||
|       return itOrbAir; |       return itOrbAir; | ||||||
|       } |       } | ||||||
|  |     CHK(!nowhereToBlow, isBlowableMonster(c->monst) ? XLAT("Nowhere to blow %the1!", c->monst) : XLAT("Nowhere to blow %the1!", c->wall)); | ||||||
|     } |     } | ||||||
|    |    | ||||||
|  |   int jumpstate = 0; | ||||||
|  |  | ||||||
|   // nature |   // nature | ||||||
|   if(items[itOrbNature] && numplayers() == 1 && c->monst != moFriendlyIvy) { |   if(items[itOrbNature] | ||||||
|  |     && CHK(numplayers() == 1, XLAT("Cannot be used in multiplayer")) | ||||||
|  |     && CHK(c->monst != moFriendlyIvy, XLAT("You cannot grow on yourself!")) | ||||||
|  |     ) { | ||||||
|     vector<int> dirs; |     vector<int> dirs; | ||||||
|     forCellIdCM(cf, d, c) |     forCellIdCM(cf, d, c) | ||||||
|       if(cf->monst == moFriendlyIvy) { |       if(cf->monst == moFriendlyIvy) { | ||||||
|  |  | ||||||
|         if(c->monst) { |         if(c->monst ? ( | ||||||
|           if(!canAttack(cf, moFriendlyIvy, c, c->monst, 0)) continue; |           CHK(canAttack(cf, moFriendlyIvy, c, c->monst, 0), XLAT("Cannot attack there!")) && | ||||||
|           if(monstersnear(cwt.at, moPlayer)) continue; |           CHKV(!monstersnear(cwt.at, moPlayer), jumpstate = 99) | ||||||
|           } |           ) : ( | ||||||
|         else { |           CHK(passable(c, cf, P_ISPLAYER | P_MONSTER), XLAT("Cannot grow there!")) && | ||||||
|           if(!passable(c, cf, P_ISPLAYER | P_MONSTER)) continue; |           CHK(!strictlyAgainstGravity(c, cf, false, MF_IVY), XLAT("Cannot grow against gravity!")) && | ||||||
|           if(strictlyAgainstGravity(c, cf, false, MF_IVY)) continue; |           CHKV(!monstersnear(cwt.at, moPlayer), jumpstate = 99)) | ||||||
|           if(monstersnear(cwt.at, moPlayer)) continue; |           ) | ||||||
|           } |  | ||||||
|           dirs.push_back(d); |           dirs.push_back(d); | ||||||
|         } |         } | ||||||
|        |        | ||||||
|     int di = hrand_elt(dirs, -1); |     int di = hrand_elt(dirs, -1); | ||||||
|     if(di != -1) { |     if(CHK(di != -1, XLAT("You cannot grow there from any adjacent cell!"))) { | ||||||
|       if(!isCheck(a)) growIvyTo(movei(c, di).rev()), apply_impact(c); |       if(!isCheck(a)) growIvyTo(movei(c, di).rev()), apply_impact(c); | ||||||
|       return itOrbNature; |       return itOrbNature; | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|      |      | ||||||
|   // (0'') jump |   // (0'') jump | ||||||
|   int jumpstate = 0; |  | ||||||
|   cell *jumpthru = NULL; |   cell *jumpthru = NULL; | ||||||
|    |    | ||||||
|   // orb of vaulting |   // orb of vaulting | ||||||
| @@ -1408,20 +1430,29 @@ EX eItem targetRangedOrb(cell *c, orbAction a) { | |||||||
|     } |     } | ||||||
|    |    | ||||||
|   // (1) switch with an illusion |   // (1) switch with an illusion | ||||||
|   if(items[itOrbTeleport] && c->monst == moIllusion && !cwt.at->monst && teleportAction() == 1) { |   if(items[itOrbTeleport] && c->monst == moIllusion | ||||||
|  |     && CHK(!cwt.at->monst, XLAT("You need to move to give space to %the1!", cwt.at->monst)) | ||||||
|  |     && CHK(teleportAction() == 1, XLAT("All players are in the game!"))) { | ||||||
|     if(!isCheck(a)) teleportTo(c), apply_impact(c); |     if(!isCheck(a)) teleportTo(c), apply_impact(c); | ||||||
|     return itOrbTeleport; |     return itOrbTeleport; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   // (2) place illusion |   // (2) place illusion | ||||||
|   if(!shmup::on && items[itOrbIllusion] && c->monst == moNone && c->item == itNone && passable(c, NULL, P_MIRROR)) { |   if(!shmup::on && items[itOrbIllusion] | ||||||
|  |     && CHK(c->monst == moNone, XLAT("Cannot cast illusion on a monster!")) | ||||||
|  |     && CHK(c->item == itNone, XLAT("Cannot cast illusion on an item!")) | ||||||
|  |     && CHK(passable(c, NULL, P_MIRROR), XLAT("Cannot cast illusion here!"))) { | ||||||
|     if(!isCheck(a)) placeIllusion(c), apply_impact(c); |     if(!isCheck(a)) placeIllusion(c), apply_impact(c); | ||||||
|     return itOrbIllusion; |     return itOrbIllusion; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   // (3) teleport |   // (3) teleport | ||||||
|   if(items[itOrbTeleport] && c->monst == moNone && (c->item == itNone || itemHidden(c)) &&  |   if(items[itOrbTeleport] | ||||||
|     passable(c, NULL, P_ISPLAYER | P_TELE) && teleportAction() && shmup::verifyTeleport()) { |     && CHK(c->monst == moNone, XLAT("Cannot teleport on a monster!")) | ||||||
|  |     && CHK(c->item == itNone || itemHidden(c), XLAT("Cannot teleport on an item!")) | ||||||
|  |     && CHK(passable(c, NULL, P_ISPLAYER | P_TELE), XLAT("Cannot teleport here!")) | ||||||
|  |     && CHK(teleportAction(),  XLAT("All players are in the game!")) | ||||||
|  |     && shmup::verifyTeleport()) { | ||||||
|     if(!isCheck(a)) teleportTo(c), apply_impact(c); |     if(!isCheck(a)) teleportTo(c), apply_impact(c); | ||||||
|     return itOrbTeleport; |     return itOrbTeleport; | ||||||
|     } |     } | ||||||
| @@ -1438,7 +1469,10 @@ EX eItem targetRangedOrb(cell *c, orbAction a) { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|   // (4a) colt |   // (4a) colt | ||||||
|   if(!shmup::on && items[itRevolver] && c->monst && canAttack(cwt.at, moPlayer, c, c->monst, AF_GUN)) { |   if(items[itRevolver] && !shmup::on | ||||||
|  |     && CHK(c->monst, XLAT("Can only use %the1 on a monster!", itRevolver)) | ||||||
|  |     && CHK(canAttack(cwt.at, moPlayer, c, c->monst, AF_GUN), XLAT("%The1 is immune to %the2!", c->monst, itRevolver)) | ||||||
|  |     ) { | ||||||
|     bool inrange = false; |     bool inrange = false; | ||||||
|     for(cell *c1: gun_targets(cwt.at)) if(c1 == c) inrange = true; |     for(cell *c1: gun_targets(cwt.at)) if(c1 == c) inrange = true; | ||||||
|     if(inrange) { |     if(inrange) { | ||||||
| @@ -1448,50 +1482,66 @@ EX eItem targetRangedOrb(cell *c, orbAction a) { | |||||||
|     } |     } | ||||||
|    |    | ||||||
|   // (5) psi blast (non-shmup variant) |   // (5) psi blast (non-shmup variant) | ||||||
|   if(!shmup::on && items[itOrbPsi] && c->monst && (isDragon(c->monst) || !isWorm(c)) && c->monst != moShadow && c->monst != moKrakenH) { |   if(!shmup::on && items[itOrbPsi] | ||||||
|  |     && CHK(c->monst, XLAT("Can only use %the1 on a monster!", itOrbPsi)) | ||||||
|  |     && CHK((isDragon(c->monst) || !isWorm(c)) && c->monst != moShadow && c->monst != moKrakenH, XLAT("%The1 is immune to mental blasts!", c->monst)) | ||||||
|  |     ) { | ||||||
|     if(!isCheck(a)) psi_attack(c), apply_impact(c); |     if(!isCheck(a)) psi_attack(c), apply_impact(c); | ||||||
|     return itOrbPsi; |     return itOrbPsi; | ||||||
|     } |     } | ||||||
|    |    | ||||||
|   // (5a) summoning |   // (5a) summoning | ||||||
|   if(items[itOrbSummon] && summonedAt(c)) { |   if(items[itOrbSummon] | ||||||
|  |     && CHK(summonedAt(c), c->monst ? XLAT("Cannot summon on a monster!") : XLAT("No summoning possible here!")) | ||||||
|  |     ) { | ||||||
|     if(!isCheck(a)) summonAt(c), apply_impact(c); |     if(!isCheck(a)) summonAt(c), apply_impact(c); | ||||||
|     return itOrbSummon; |     return itOrbSummon; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   // (5b) matter |   // (5b) matter | ||||||
|   if(items[itOrbMatter] && tempWallPossibleAt(c)) { |   if(items[itOrbMatter] | ||||||
|  |     && CHK(tempWallPossibleAt(c),  | ||||||
|  |       c->monst ? XLAT("Cannot create temporary matter on a monster!") : | ||||||
|  |       c->item ? XLAT("Cannot create temporary matter on an item!") : | ||||||
|  |       XLAT("Cannot create temporary matter here!")) | ||||||
|  |     ) { | ||||||
|     if(!isCheck(a)) tempWallAt(c), apply_impact(c); |     if(!isCheck(a)) tempWallAt(c), apply_impact(c); | ||||||
|     return itOrbMatter; |     return itOrbMatter; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   // (5c) stun |   // (5c) stun | ||||||
|   if(items[itOrbStunning] && c->monst && !isMultitile(c->monst) && c->monst != moMimic && c->stuntime < 3 && !shmup::on) { |   if(items[itOrbStunning] && !shmup::on | ||||||
|  |     && CHK(c->monst, XLAT("%The1 can only be used on monsters.", itOrbStunning)) | ||||||
|  |     && CHK(!isMultitile(c->monst),XLAT("%The1 cannot be used on big monsters.", itOrbStunning)) | ||||||
|  |     && CHK(c->monst != moMimic, XLAT("%The1 cannot be used on %the2.", itOrbStunning, c->monst)) | ||||||
|  |     && CHK(c->stuntime < 3, XLAT("%The1 is already stunned!", c->monst)) | ||||||
|  |     ) { | ||||||
|     if(!isCheck(a)) stun_attack(c), apply_impact(c); |     if(!isCheck(a)) stun_attack(c), apply_impact(c); | ||||||
|     return itOrbStunning; |     return itOrbStunning; | ||||||
|     } |     } | ||||||
|    |    | ||||||
|   // (5d) poly |   // (5d) poly | ||||||
|   if(items[itOrbMorph] && c->monst && !isMultitile(c->monst) && !shmup::on) { |   if(items[itOrbMorph] && !shmup::on | ||||||
|  |     && CHK(c->monst, XLAT("%The1 can only be used on monsters.", itOrbMorph)) | ||||||
|  |     && CHK(!isMultitile(c->monst), XLAT("%The1 cannot be used on big monsters.", itOrbMorph)) | ||||||
|  |     ) { | ||||||
|     if(!isCheck(a)) poly_attack(c), apply_impact(c); |     if(!isCheck(a)) poly_attack(c), apply_impact(c); | ||||||
|     return itOrbMorph; |     return itOrbMorph; | ||||||
|     } |     } | ||||||
|    |    | ||||||
|   // (6) place fire (non-shmup variant) |   // (6) place fire (non-shmup variant) | ||||||
|   if(!shmup::on && items[itOrbDragon] && makeflame(c, 20, true)) { |   if(items[itOrbDragon] && !shmup::on | ||||||
|  |     && CHK(makeflame(c, 20, true), XLAT("Cannot throw fire there!")) | ||||||
|  |     ) { | ||||||
|     if(!isCheck(a)) useOrbOfDragon(c), apply_impact(c); |     if(!isCheck(a)) useOrbOfDragon(c), apply_impact(c); | ||||||
|     return itOrbDragon; |     return itOrbDragon; | ||||||
|     } |     } | ||||||
|    |    | ||||||
|   if(isWeakCheck(a)) return itNone; |   if(isWeakCheck(a)) return itNone; | ||||||
|    |    | ||||||
|   if(nowhereToBlow && isBlowableMonster(c->monst)) { |   for(string s: orb_error_messages) addMessage(s); | ||||||
|     addMessage(XLAT("Nowhere to blow %the1!", c->monst)); |  | ||||||
|     }   |   if(jumpstate == 1 && jumpthru && jumpthru->monst) { | ||||||
|   else if(nowhereToBlow) { |  | ||||||
|     addMessage(XLAT("Nowhere to blow %the1!", c->wall)); |  | ||||||
|     } |  | ||||||
|   else if(jumpstate == 1 && jumpthru && jumpthru->monst) { |  | ||||||
|     addMessage(XLAT("Cannot jump through %the1!", jumpthru->monst)); |     addMessage(XLAT("Cannot jump through %the1!", jumpthru->monst)); | ||||||
|     } |     } | ||||||
|   else if(jumpstate == 1 && jumpthru) { |   else if(jumpstate == 1 && jumpthru) { | ||||||
| @@ -1505,58 +1555,13 @@ EX eItem targetRangedOrb(cell *c, orbAction a) { | |||||||
|     } |     } | ||||||
|   else if(jumpstate == 3)  |   else if(jumpstate == 3)  | ||||||
|     wouldkill("%The1 would get you there!"); |     wouldkill("%The1 would get you there!"); | ||||||
|   else if(items[itOrbAir] && c->monst) { |   else if(jumpstate == 99) | ||||||
|     addMessage(XLAT("%The1 is immune to wind!", c->monst)); |     wouldkill("%The1 would get you if you grew there!"); | ||||||
|     }   |  | ||||||
|   else if(items[itOrbPsi] && c->monst) { |  | ||||||
|     addMessage(XLAT("%The1 is immune to mental blasts!", c->monst)); |  | ||||||
|     }   |  | ||||||
|   else if(items[itOrbTeleport] && c->monst) { |  | ||||||
|     addMessage(XLAT("Cannot teleport on a monster!")); |  | ||||||
|     } |  | ||||||
|   else if(items[itOrbSpace] && c->item == itBarrow) |  | ||||||
|     addMessage(XLAT("%The1 is protected from this kind of magic!", c->item)); |  | ||||||
|   else if(items[itOrbSpace] && saved_tortoise_on(c)) |  | ||||||
|     addMessage(XLAT("No, that would be heartless!")); |  | ||||||
|   else if(c->item && items[itOrbSpace] && !itemHiddenFromSight(c)) { |  | ||||||
|     if(cwt.at->item) |  | ||||||
|       addMessage(XLAT("Cannot use %the1 here!", itOrbSpace)); |  | ||||||
|     addMessage(XLAT("Not enough power for telekinesis!")); |  | ||||||
|     } |  | ||||||
|   else if(items[itOrbIllusion] && c->item) |  | ||||||
|     addMessage(XLAT("Cannot cast illusion on an item!")); |  | ||||||
|   else if(items[itOrbIllusion] && c->monst) |  | ||||||
|     addMessage(XLAT("Cannot cast illusion on a monster!")); |  | ||||||
|   else if(items[itOrbIllusion] && !passable(c, NULL, P_MIRROR)) |  | ||||||
|     addMessage(XLAT("Cannot cast illusion here!")); |  | ||||||
|   else if(items[itOrbTeleport] && teleportAction() == 0) { |  | ||||||
|     addMessage(XLAT("All players are in the game!")); |  | ||||||
|     } |  | ||||||
|   else if(items[itOrbTeleport] && !passable(c, NULL, P_TELE | P_ISPLAYER)) { |  | ||||||
|     addMessage(XLAT("Cannot teleport here!")); |  | ||||||
|     } |  | ||||||
|   else if(items[itOrbMatter] && !tempWallPossibleAt(c)) { |  | ||||||
|     if(c->monst) |  | ||||||
|       addMessage(XLAT("Cannot create temporary matter on a monster!")); |  | ||||||
|     else if(c->item) |  | ||||||
|       addMessage(XLAT("Cannot create temporary matter on an item!")); |  | ||||||
|     else addMessage(XLAT("Cannot create temporary matter here!")); |  | ||||||
|     } |  | ||||||
|   else if(items[itOrbSummon] && !summonedAt(c)) { |  | ||||||
|     if(c->monst) |  | ||||||
|       addMessage(XLAT("Cannot summon on a monster!")); |  | ||||||
|     else |  | ||||||
|       addMessage(XLAT("No summoning possible here!")); |  | ||||||
|     } |  | ||||||
|   else if(items[itOrbTeleport] && c->item) { |  | ||||||
|     addMessage(XLAT("Cannot teleport on an item!")); |  | ||||||
|     } |  | ||||||
|   else if(items[itOrbDragon] && !makeflame(c, 20, true)) { |  | ||||||
|     addMessage(XLAT("Cannot throw fire there!")); |  | ||||||
|     } |  | ||||||
|   else return eItem(0); |  | ||||||
|  |  | ||||||
|   return eItem(-1); |   #undef CHK | ||||||
|  |   #undef CHKV | ||||||
|  |    | ||||||
|  |   return itNone; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| EX int orbcharges(eItem it) { | EX int orbcharges(eItem it) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Zeno Rogue
					Zeno Rogue