freezers can create ice sheets

This commit is contained in:
devZoGok
2025-06-08 10:01:28 +03:00
parent c101c75b81
commit 83b32bb434
10 changed files with 46 additions and 40 deletions
@@ -275,9 +275,6 @@ units = {
deathFx = {explosionVfx, explosionSfx}, deathFx = {explosionVfx, explosionSfx},
}, },
{ {
weapons = {
{orderType = OrderType.ATTACK, rateOfFire = 2000, fireSfx = PATH .. 'Sounds/Units/WarMechs/fire.ogg', damage = 20, maxRange = 8},
},
buildableUnits = { buildableUnits = {
{id = UnitId.LAND_FACTORY, buildable = true, trigger = 76}, {id = UnitId.LAND_FACTORY, buildable = true, trigger = 76},
{id = UnitId.NAVAL_FACTORY, buildable = true, trigger = 78}, {id = UnitId.NAVAL_FACTORY, buildable = true, trigger = 78},
@@ -848,7 +845,7 @@ units = {
waterHitFx = {}, waterHitFx = {},
} }
}, },
--buildableUnits = {{id = UnitId.ICE_SHEET, buildable = true, trigger = 83}}, buildableUnits = {{id = UnitId.ICE_SHEET, buildable = true, trigger = 83}},
unitClass = UnitClass.FREEZER, unitClass = UnitClass.FREEZER,
unitType = UnitType.SEA_LEVEL, unitType = UnitType.SEA_LEVEL,
isVehicle = true, isVehicle = true,
+6 -1
View File
@@ -82,12 +82,17 @@ function generateGui(unitId)
mainUnit.unitClass == UnitClass.FORT mainUnit.unitClass == UnitClass.FORT
) )
isEng = (
mainUnit.unitClass == UnitClass.ENGINEER or
mainUnit.unitClass == UnitClass.FREEZER
)
buttonData = { buttonData = {
trigger = buildUnit.trigger, trigger = buildUnit.trigger,
name = units[buildUnit.id + 1].name, name = units[buildUnit.id + 1].name,
buttonType = (mainUnit.isVehicle and ButtonType.BUILD or ButtonType.TRAIN), buttonType = (mainUnit.isVehicle and ButtonType.BUILD or ButtonType.TRAIN),
factoryId = (isFactory and unitId or nil), 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) slotId = (ButtonType.BUILD and i - 1 or nil)
} }
gui[#gui + 1] = generateButton(#gui, buttonData) gui[#gui + 1] = generateButton(#gui, buttonData)
+1 -1
View File
@@ -703,7 +703,7 @@ namespace battleship{
else if(cursorState == CursorState::HACK){ else if(cursorState == CursorState::HACK){
if(orderPossible) issueOrder(Order::TYPE::HACK, vector<Order::Target>{Order::Target((Unit*)gameObjHoveredOn)}, shiftPressed); if(orderPossible) issueOrder(Order::TYPE::HACK, vector<Order::Target>{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(); castRayToTerrain();
GameObjectFrame gmObjFr = ufCtr->getGameObjectFrame(0); GameObjectFrame gmObjFr = ufCtr->getGameObjectFrame(0);
+1 -29
View File
@@ -50,40 +50,12 @@ namespace battleship{
hackStatus = 0; 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 //TODO change unit colors after faction change
void Engineer::hack(Order order){ void Engineer::hack(Order order){
Unit *targUnit = order.targets[0].unit; Unit *targUnit = order.targets[0].unit;
bool withinRange = (targUnit->getPos().getDistanceFrom(pos) < hackRange); bool withinRange = (targUnit->getPos().getDistanceFrom(pos) < hackRange);
int hackRate = int(generateView()["units"][id + 1]["hackTime"]) / 100; int hackRate = int(generateView()["units"][id + 1]["hackTime"]) / 100;
bool canHack = (getTime() - lastIncrementTime > hackRate); bool canHack = (getTime() - lastHackTime > hackRate);
if(withinRange && canHack){ if(withinRange && canHack){
hackStatus++; hackStatus++;
+1 -2
View File
@@ -20,10 +20,9 @@ namespace battleship{
private: private:
int hackStatus = 0; int hackStatus = 0;
float hackRange; float hackRange;
vb01::s64 lastIncrementTime = 0; vb01::s64 lastHackTime = 0;
vb01::Node *hackStatusBackground = nullptr, *hackStatusForeground = nullptr; vb01::Node *hackStatusBackground = nullptr, *hackStatusForeground = nullptr;
void build(Order);
void hack(Order); void hack(Order);
}; };
} }
+3
View File
@@ -11,6 +11,9 @@ namespace battleship{
void IceSheet::update(){ void IceSheet::update(){
Structure::update(); Structure::update();
if(buildStatus < 100)
model->getChild(0)->setScale(.01 * buildStatus * Vector3::VEC_IJK);
for(Player *pl : Game::getSingleton()->getPlayers(true)){ for(Player *pl : Game::getSingleton()->getPlayers(true)){
vector<Unit*> icebreakers = pl->getUnitsByClass(UnitClass::ICEBREAKER); vector<Unit*> icebreakers = pl->getUnitsByClass(UnitClass::ICEBREAKER);
+1 -1
View File
@@ -17,9 +17,9 @@ namespace battleship{
inline int getBuildStatus(){return buildStatus;} inline int getBuildStatus(){return buildStatus;}
inline void incrementBuildStatus(){buildStatus++;} inline void incrementBuildStatus(){buildStatus++;}
private: private:
int buildStatus = 0;
protected: protected:
vb01::Node *buildStatusBackground = nullptr, *buildStatusForeground = nullptr; vb01::Node *buildStatusBackground = nullptr, *buildStatusForeground = nullptr;
int buildStatus = 0;
}; };
} }
+1 -1
View File
@@ -451,7 +451,7 @@ namespace battleship{
case Order::TYPE::ATTACK: case Order::TYPE::ATTACK:
return !getWeaponsByOrder(Order::TYPE::ATTACK).empty(); return !getWeaponsByOrder(Order::TYPE::ATTACK).empty();
case Order::TYPE::BUILD: case Order::TYPE::BUILD:
return unitClass == UnitClass::ENGINEER; return (unitClass == UnitClass::ENGINEER || unitClass == UnitClass::FREEZER);
case Order::TYPE::PATROL: case Order::TYPE::PATROL:
case Order::TYPE::MOVE: case Order::TYPE::MOVE:
return vehicle; return vehicle;
+29 -1
View File
@@ -7,9 +7,10 @@
#include <model.h> #include <model.h>
#include <quaternion.h> #include <quaternion.h>
#include "pathfinder.h"
#include "structure.h"
#include "vehicle.h" #include "vehicle.h"
#include "weapon.h" #include "weapon.h"
#include "pathfinder.h"
#include "player.h" #include "player.h"
#include "game.h" #include "game.h"
#include "map.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(){ void Vehicle::select(){
if(!garrisonable) if(!garrisonable)
+2
View File
@@ -23,6 +23,7 @@ namespace battleship{
float speed, maxTurnAngle, anglePrecision; float speed, maxTurnAngle, anglePrecision;
vb01::Material *debugMat = nullptr; vb01::Material *debugMat = nullptr;
std::vector<vb01::Node*> debugPathPoints; std::vector<vb01::Node*> debugPathPoints;
vb01::s64 lastBuildTime = 0;
inline int getNextPatrolPointId(int numPoints) {return patrolPointId == numPoints - 1 ? 0 : patrolPointId + 1;} inline int getNextPatrolPointId(int numPoints) {return patrolPointId == numPoints - 1 ? 0 : patrolPointId + 1;}
bool validateGarrisonOrder(Order); bool validateGarrisonOrder(Order);
@@ -34,6 +35,7 @@ namespace battleship{
void addPathpoint(vb01::Vector3); void addPathpoint(vb01::Vector3);
void removePathpoint(int = 0); void removePathpoint(int = 0);
void removeAllPathpoints(); void removeAllPathpoints();
void build(Order);
void select(); void select();
void reinit(); void reinit();
protected: protected: