diff --git a/Assets/Scripts/GameObjects/Units/unitData.lua b/Assets/Scripts/GameObjects/Units/unitData.lua index 6f60e18..29c8386 100644 --- a/Assets/Scripts/GameObjects/Units/unitData.lua +++ b/Assets/Scripts/GameObjects/Units/unitData.lua @@ -275,9 +275,6 @@ units = { deathFx = {explosionVfx, explosionSfx}, }, { - weapons = { - {orderType = OrderType.ATTACK, rateOfFire = 2000, fireSfx = PATH .. 'Sounds/Units/WarMechs/fire.ogg', damage = 20, maxRange = 8}, - }, buildableUnits = { {id = UnitId.LAND_FACTORY, buildable = true, trigger = 76}, {id = UnitId.NAVAL_FACTORY, buildable = true, trigger = 78}, @@ -848,7 +845,7 @@ units = { waterHitFx = {}, } }, - --buildableUnits = {{id = UnitId.ICE_SHEET, buildable = true, trigger = 83}}, + buildableUnits = {{id = UnitId.ICE_SHEET, buildable = true, trigger = 83}}, unitClass = UnitClass.FREEZER, unitType = UnitType.SEA_LEVEL, isVehicle = true, diff --git a/Assets/Scripts/Gui/unitGui.lua b/Assets/Scripts/Gui/unitGui.lua index deb6fbf..c230648 100644 --- a/Assets/Scripts/Gui/unitGui.lua +++ b/Assets/Scripts/Gui/unitGui.lua @@ -82,12 +82,17 @@ function generateGui(unitId) mainUnit.unitClass == UnitClass.FORT ) + isEng = ( + mainUnit.unitClass == UnitClass.ENGINEER or + mainUnit.unitClass == UnitClass.FREEZER + ) + buttonData = { trigger = buildUnit.trigger, name = units[buildUnit.id + 1].name, buttonType = (mainUnit.isVehicle and ButtonType.BUILD or ButtonType.TRAIN), factoryId = (isFactory and unitId or nil), - engineerId = (mainUnit.unitClass == UnitClass.ENGINEER and unitId or nil), + engineerId = (isEng and unitId or nil), slotId = (ButtonType.BUILD and i - 1 or nil) } gui[#gui + 1] = generateButton(#gui, buttonData) diff --git a/activeGameState.cpp b/activeGameState.cpp index f890a9a..b6553c7 100755 --- a/activeGameState.cpp +++ b/activeGameState.cpp @@ -703,7 +703,7 @@ namespace battleship{ else if(cursorState == CursorState::HACK){ if(orderPossible) issueOrder(Order::TYPE::HACK, vector{Order::Target((Unit*)gameObjHoveredOn)}, shiftPressed); } - else if(selectedUnits[0]->getUnitClass() == UnitClass::ENGINEER && ufCtr->isPlacingOnSurface()){ + else if((selectedUnits[0]->getUnitClass() == UnitClass::ENGINEER || selectedUnits[0]->getUnitClass() == UnitClass::FREEZER) && ufCtr->isPlacingOnSurface()){ castRayToTerrain(); GameObjectFrame gmObjFr = ufCtr->getGameObjectFrame(0); diff --git a/engineer.cpp b/engineer.cpp index 8d54681..f509ba9 100644 --- a/engineer.cpp +++ b/engineer.cpp @@ -50,40 +50,12 @@ namespace battleship{ hackStatus = 0; } - void Engineer::build(Order order){ - if(pathPoints.empty()){ - if(!order.targets[0].unit) - player->addUnit(order.targets[0].unit); - else { - Structure *structure = (Structure*)order.targets[0].unit; - sol::table targTable = generateView()["units"][order.targets[0].unit->getId()]; - int costRate = (int)targTable["cost"] / 100, buildRate = (int)targTable["buildTime"] / 100; - - if(structure->getBuildStatus() < 100 && player->getResource(ResourceType::REFINEDS) >= costRate && getTime() - lastIncrementTime > buildRate){ - structure->incrementBuildStatus(); - player->updateResource(ResourceType::REFINEDS, -costRate, true); - lastIncrementTime = getTime(); - } - else if(structure->getBuildStatus() >= 100){ - removeOrder(0); - player->incStructuresBuilt(); - } - } - } - else{ - navigate(0.5 * Map::getSingleton()->getCellSize().x); - - if(type == UnitType::LAND) - alignToSurface(); - } - } - //TODO change unit colors after faction change void Engineer::hack(Order order){ Unit *targUnit = order.targets[0].unit; bool withinRange = (targUnit->getPos().getDistanceFrom(pos) < hackRange); int hackRate = int(generateView()["units"][id + 1]["hackTime"]) / 100; - bool canHack = (getTime() - lastIncrementTime > hackRate); + bool canHack = (getTime() - lastHackTime > hackRate); if(withinRange && canHack){ hackStatus++; diff --git a/engineer.h b/engineer.h index f038591..efa71b5 100644 --- a/engineer.h +++ b/engineer.h @@ -20,10 +20,9 @@ namespace battleship{ private: int hackStatus = 0; float hackRange; - vb01::s64 lastIncrementTime = 0; + vb01::s64 lastHackTime = 0; vb01::Node *hackStatusBackground = nullptr, *hackStatusForeground = nullptr; - void build(Order); void hack(Order); }; } diff --git a/iceSheet.cpp b/iceSheet.cpp index b361a3e..fea125f 100644 --- a/iceSheet.cpp +++ b/iceSheet.cpp @@ -11,6 +11,9 @@ namespace battleship{ void IceSheet::update(){ Structure::update(); + if(buildStatus < 100) + model->getChild(0)->setScale(.01 * buildStatus * Vector3::VEC_IJK); + for(Player *pl : Game::getSingleton()->getPlayers(true)){ vector icebreakers = pl->getUnitsByClass(UnitClass::ICEBREAKER); diff --git a/structure.h b/structure.h index da01ffa..37d4fa3 100644 --- a/structure.h +++ b/structure.h @@ -17,9 +17,9 @@ namespace battleship{ inline int getBuildStatus(){return buildStatus;} inline void incrementBuildStatus(){buildStatus++;} private: - int buildStatus = 0; protected: vb01::Node *buildStatusBackground = nullptr, *buildStatusForeground = nullptr; + int buildStatus = 0; }; } diff --git a/unit.cpp b/unit.cpp index 796d5e1..7d9f176 100755 --- a/unit.cpp +++ b/unit.cpp @@ -451,7 +451,7 @@ namespace battleship{ case Order::TYPE::ATTACK: return !getWeaponsByOrder(Order::TYPE::ATTACK).empty(); case Order::TYPE::BUILD: - return unitClass == UnitClass::ENGINEER; + return (unitClass == UnitClass::ENGINEER || unitClass == UnitClass::FREEZER); case Order::TYPE::PATROL: case Order::TYPE::MOVE: return vehicle; diff --git a/vehicle.cpp b/vehicle.cpp index f26183d..1c5eb69 100644 --- a/vehicle.cpp +++ b/vehicle.cpp @@ -7,9 +7,10 @@ #include #include +#include "pathfinder.h" +#include "structure.h" #include "vehicle.h" #include "weapon.h" -#include "pathfinder.h" #include "player.h" #include "game.h" #include "map.h" @@ -355,6 +356,33 @@ namespace battleship{ } } + void Vehicle::build(Order order){ + if(pathPoints.empty()){ + if(!order.targets[0].unit) + player->addUnit(order.targets[0].unit); + else { + Structure *structure = (Structure*)order.targets[0].unit; + sol::table targTable = generateView()["units"][structure->getId()]; + int costRate = (int)targTable["cost"] / 100, buildRate = (int)targTable["buildTime"] / 100; + + if(structure->getBuildStatus() < 100 && player->getResource(ResourceType::REFINEDS) >= costRate && getTime() - lastBuildTime > buildRate){ + structure->incrementBuildStatus(); + player->updateResource(ResourceType::REFINEDS, -costRate, true); + lastBuildTime = getTime(); + } + else if(structure->getBuildStatus() >= 100){ + removeOrder(0); + player->incStructuresBuilt(); + } + } + } + else{ + navigate(0.5 * Map::getSingleton()->getCellSize().x); + + if(type == UnitType::LAND) + alignToSurface(); + } + } void Vehicle::select(){ if(!garrisonable) diff --git a/vehicle.h b/vehicle.h index 40eb0fc..04e2ee7 100644 --- a/vehicle.h +++ b/vehicle.h @@ -23,6 +23,7 @@ namespace battleship{ float speed, maxTurnAngle, anglePrecision; vb01::Material *debugMat = nullptr; std::vector debugPathPoints; + vb01::s64 lastBuildTime = 0; inline int getNextPatrolPointId(int numPoints) {return patrolPointId == numPoints - 1 ? 0 : patrolPointId + 1;} bool validateGarrisonOrder(Order); @@ -34,6 +35,7 @@ namespace battleship{ void addPathpoint(vb01::Vector3); void removePathpoint(int = 0); void removeAllPathpoints(); + void build(Order); void select(); void reinit(); protected: