/** * Get a tile in the direction of a destination, randomized a bit. * * @param packed_from The origin. * @param packed_to The destination. * @return A packed tile. */ uint16 Tile_GetTileInDirectionOf(uint16 packed_from, uint16 packed_to) { int16 distance; uint8 direction; uint8 i; if (packed_from == 0 || packed_to == 0) return 0; distance = Tile_GetDistancePacked(packed_from, packed_to); direction = Tile_GetDirectionPacked(packed_to, packed_from); if (distance <= 10) return 0; for (i = 0; i < 4; i++) { int16 dir; tile32 position; uint16 packed; dir = 29 + (Tools_Random_256() & 0x3F); if ((Tools_Random_256() & 1) != 0) dir = -dir; position = Tile_UnpackTile(packed_to); position = Tile_MoveByDirection(position, direction + dir, min(distance, 20) << 8); packed = Tile_PackTile(position); if (Map_IsValidPosition(packed)) return packed; } return 0; }
/** * Unknown function 0788. * * Stack: *none*. * * @param script The script engine to operate on. * @return The value 0. Always. */ uint16 Script_Team_Unknown0788(ScriptEngine *script) { Team *t; tile32 tile; PoolFindStruct find; VARIABLE_NOT_USED(script); t = g_scriptCurrentTeam; if (t->target == 0) return 0; tile = Tools_Index_GetTile(t->target); find.houseID = t->houseID; find.index = 0xFFFF; find.type = 0xFFFF; while (true) { Unit *u; uint16 distance; uint16 packed; int16 orientation; u = Unit_Find(&find); if (u == NULL) break; if (u->team - 1 != t->index) continue; if (t->target == 0) { Unit_SetAction(u, ACTION_GUARD); continue; } distance = g_table_unitInfo[u->o.type].fireDistance << 8; if (u->actionID == ACTION_ATTACK && u->targetAttack == t->target) { if (u->targetMove != 0) continue; if (Tile_GetDistance(u->o.position, tile) >= distance) continue; } if (u->actionID != ACTION_ATTACK) Unit_SetAction(u, ACTION_ATTACK); orientation = (Tile_GetDirection(tile, u->o.position) & 0xC0) + Tools_RandomLCG_Range(0, 127); if (orientation < 0) orientation += 256; packed = Tile_PackTile(Tile_MoveByDirection(tile, orientation, distance)); if (Object_GetByPackedTile(packed) == NULL) { Unit_SetDestination(u, Tools_Index_Encode(packed, IT_TILE)); } else { Unit_SetDestination(u, Tools_Index_Encode(Tile_PackTile(tile), IT_TILE)); } Unit_SetTarget(u, t->target); } return 0; }