Hacked wood,rocks and wall placing.
This commit is contained in:
parent
4e30e520f5
commit
c50d715359
1 changed files with 129 additions and 85 deletions
|
@ -54,6 +54,7 @@
|
|||
|
||||
extern void PreMenuSetup(void); /// FIXME: not here!
|
||||
extern void DoScrollArea(enum _scroll_state_ state, int fast);
|
||||
local void EditorSavePud(const char *file);
|
||||
|
||||
extern struct {
|
||||
const char* File[PlayerMaxRaces]; /// Resource filename one for each race
|
||||
|
@ -124,12 +125,13 @@ local int SelectedPlayer; /// Player selected for draw
|
|||
*/
|
||||
local void ChangeTile(int x, int y, int tile)
|
||||
{
|
||||
MapField *mf;
|
||||
|
||||
DebugCheck(x < 0 || y < 0 || x >= TheMap.Width || y >= TheMap.Height);
|
||||
DebugCheck(tile < 0 || tile >= TheMap.Tileset->NumTiles);
|
||||
|
||||
TheMap.Fields[y * TheMap.Width + x].Tile =
|
||||
TheMap.Fields[y * TheMap.Width + x].SeenTile =
|
||||
TheMap.Tileset->Table[tile];
|
||||
mf = &TheMap.Fields[y * TheMap.Width + x];
|
||||
mf->Tile = mf->SeenTile = TheMap.Tileset->Table[tile];
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -190,6 +192,8 @@ local int GetTileNumber(int basic, int random, int filler)
|
|||
*/
|
||||
local void EditTile(int x, int y, int tile)
|
||||
{
|
||||
MapField* mf;
|
||||
|
||||
DebugCheck(x < 0 || y < 0 || x >= TheMap.Width || y >= TheMap.Height);
|
||||
|
||||
ChangeTile(x, y, GetTileNumber(tile, TileToolRandom, TileToolDecoration));
|
||||
|
@ -197,70 +201,65 @@ local void EditTile(int x, int y, int tile)
|
|||
//
|
||||
// Change the flags
|
||||
//
|
||||
TheMap.Fields[y * TheMap.Width + x].Flags &=
|
||||
~(MapFieldHuman | MapFieldLandAllowed | MapFieldCoastAllowed |
|
||||
mf = &TheMap.Fields[y * TheMap.Width + x];
|
||||
mf->Flags &= ~(MapFieldHuman | MapFieldLandAllowed | MapFieldCoastAllowed |
|
||||
MapFieldWaterAllowed | MapFieldNoBuilding | MapFieldUnpassable |
|
||||
MapFieldWall | MapFieldRocks | MapFieldForest);
|
||||
|
||||
#if 1
|
||||
TheMap.Fields[y * TheMap.Width + x].Flags |=
|
||||
TheMap.Tileset->FlagsTable[16 + tile * 16];
|
||||
DebugLevel3Fn("Table %x\n" _C_ TheMap.Fields[y * TheMap.Width + x].Flags);
|
||||
#else
|
||||
switch (tile) {
|
||||
case 0: // LIGHT_WATER
|
||||
case 1: // DARK_WATER
|
||||
TheMap.Fields[y * TheMap.Width + x].Flags |= MapFieldWaterAllowed;
|
||||
break;
|
||||
case 2: // LIGHT_COAST
|
||||
case 3: // DARK_COAST
|
||||
TheMap.Fields[y * TheMap.Width + x].Flags |=
|
||||
MapFieldNoBuilding | MapFieldLandAllowed;
|
||||
break;
|
||||
case 4: // LIGHT_GRASS
|
||||
case 5: // DARK_GRASS
|
||||
TheMap.Fields[y * TheMap.Width + x].Flags |= MapFieldLandAllowed;
|
||||
break;
|
||||
case 6: // FOREST
|
||||
TheMap.Fields[y * TheMap.Width + x].Flags |= MapFieldForest;
|
||||
break;
|
||||
case 7: // ROCKS
|
||||
TheMap.Fields[y * TheMap.Width + x].Flags |= MapFieldRocks;
|
||||
break;
|
||||
case 8: // HUMAN_CLOSED_WALL
|
||||
case 10: // HUMAN_OPEN_WALL
|
||||
TheMap.Fields[y * TheMap.Width + x].Flags |=
|
||||
MapFieldHuman | MapFieldWall;
|
||||
break;
|
||||
case 9: // ORC_CLOSED_WALL
|
||||
case 11: // ORC_OPEN_WALL
|
||||
TheMap.Fields[y * TheMap.Width + x].Flags |= MapFieldWall;
|
||||
break;
|
||||
case 12: // BRIDGE
|
||||
TheMap.Fields[y * TheMap.Width + x].Flags |=
|
||||
MapFieldLandAllowed | MapFieldWaterAllowed |
|
||||
MapFieldNoBuilding;
|
||||
break;
|
||||
case 13: // ROAD
|
||||
TheMap.Fields[y * TheMap.Width + x].Flags |=
|
||||
MapFieldLandAllowed | MapFieldNoBuilding;
|
||||
break;
|
||||
case 14: // FORD
|
||||
TheMap.Fields[y * TheMap.Width + x].Flags |=
|
||||
MapFieldLandAllowed | MapFieldCoastAllowed |
|
||||
MapFieldWaterAllowed | MapFieldNoBuilding;
|
||||
break;
|
||||
case 15: // ... free ...
|
||||
TheMap.Fields[y * TheMap.Width + x].Flags |=
|
||||
MapFieldHuman | MapFieldLandAllowed | MapFieldCoastAllowed |
|
||||
MapFieldWaterAllowed | MapFieldNoBuilding | MapFieldUnpassable
|
||||
| MapFieldWall | MapFieldRocks | MapFieldForest;
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
mf->Flags |= TheMap.Tileset->FlagsTable[16 + tile * 16];
|
||||
|
||||
UpdateMinimapSeenXY(x,y);
|
||||
UpdateMinimapXY(x,y);
|
||||
UpdateMinimapSeenXY(x, y);
|
||||
UpdateMinimapXY(x, y);
|
||||
|
||||
//
|
||||
// Fix the wood tiles.
|
||||
//
|
||||
if (mf->Flags & MapFieldForest) {
|
||||
if( y ) {
|
||||
ChangeTile(x, y - 1, GetTileNumber(tile, TileToolRandom,
|
||||
TileToolDecoration));
|
||||
mf[-TheMap.Width].Flags |=
|
||||
TheMap.Tileset->FlagsTable[16 + tile * 16];
|
||||
} else {
|
||||
ChangeTile(x, y + 1, GetTileNumber(tile, TileToolRandom,
|
||||
TileToolDecoration));
|
||||
mf[+TheMap.Width].Flags |=
|
||||
TheMap.Tileset->FlagsTable[16 + tile * 16];
|
||||
}
|
||||
MapFixWoodTile(x + 1, y + 0);
|
||||
MapFixWoodTile(x + 0, y + 1);
|
||||
MapFixWoodTile(x - 1, y + 0);
|
||||
MapFixWoodTile(x + 0, y - 1);
|
||||
MapFixWoodTile(x + 0, y + 0);
|
||||
} else if (mf->Flags & MapFieldRocks) {
|
||||
if( y ) {
|
||||
ChangeTile(x, y - 1, GetTileNumber(tile, TileToolRandom,
|
||||
TileToolDecoration));
|
||||
mf[-TheMap.Width].Flags |=
|
||||
TheMap.Tileset->FlagsTable[16 + tile * 16];
|
||||
} else {
|
||||
ChangeTile(x, y + 1, GetTileNumber(tile, TileToolRandom,
|
||||
TileToolDecoration));
|
||||
mf[+TheMap.Width].Flags |=
|
||||
TheMap.Tileset->FlagsTable[16 + tile * 16];
|
||||
}
|
||||
MapFixRockTile(x + 1, y + 0);
|
||||
MapFixRockTile(x + 0, y + 1);
|
||||
MapFixRockTile(x - 1, y + 0);
|
||||
MapFixRockTile(x + 0, y - 1);
|
||||
MapFixRockTile(x + 0, y + 0);
|
||||
} else if (mf->Flags & MapFieldWall) {
|
||||
if (mf->Flags & MapFieldHuman) {
|
||||
mf->Value = UnitTypeHumanWall->_HitPoints;
|
||||
} else {
|
||||
mf->Value = UnitTypeOrcWall->_HitPoints;
|
||||
}
|
||||
MapFixWallTile(x + 0, y + 0);
|
||||
MapFixWallTile(x + 1, y + 0);
|
||||
MapFixWallTile(x + 0, y + 1);
|
||||
MapFixWallTile(x - 1, y + 0);
|
||||
MapFixWallTile(x + 0, y - 1);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -293,6 +292,29 @@ local void EditTiles(int x, int y, int tile, int size)
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
** Edit unit.
|
||||
**
|
||||
** @param x X map tile coordinate.
|
||||
** @param y Y map tile coordinate.
|
||||
** @param type Unit type to edit.
|
||||
** @param player Player owning the unit.
|
||||
**
|
||||
** @todo FIXME: Check if the player has already a start-point.
|
||||
*/
|
||||
local void EditUnit(int x, int y, UnitType* type, Player* player)
|
||||
{
|
||||
Unit *unit;
|
||||
|
||||
unit = MakeUnitAndPlace(x, y, type, player);
|
||||
if (type->OilPatch || type->GivesOil) {
|
||||
unit->Value = 50000;
|
||||
}
|
||||
if (unit->Type->GoldMine) {
|
||||
unit->Value = 100000;
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
-- Display
|
||||
----------------------------------------------------------------------------*/
|
||||
|
@ -1017,19 +1039,11 @@ local void EditorCallbackButtonDown(unsigned button __attribute__ ((unused)))
|
|||
if (CanBuildUnitType(NULL, CursorBuilding,
|
||||
Viewport2MapX(TheUI.ActiveViewport, CursorX),
|
||||
Viewport2MapY(TheUI.ActiveViewport, CursorY))) {
|
||||
Unit *unit;
|
||||
|
||||
PlayGameSound(GameSounds.PlacementSuccess.Sound,
|
||||
MaxSampleVolume);
|
||||
unit = MakeUnitAndPlace(Viewport2MapX(TheUI.ActiveViewport,
|
||||
CursorX), Viewport2MapY(TheUI.ActiveViewport, CursorY),
|
||||
EditUnit(Viewport2MapX(TheUI.ActiveViewport,CursorX),
|
||||
Viewport2MapY(TheUI.ActiveViewport, CursorY),
|
||||
CursorBuilding, Players + SelectedPlayer);
|
||||
if (unit->Type->OilPatch || unit->Type->GivesOil) {
|
||||
unit->Value = 50000;
|
||||
}
|
||||
if (unit->Type->GoldMine) {
|
||||
unit->Value = 100000;
|
||||
}
|
||||
} else {
|
||||
SetStatusLine("Unit can't be placed here.");
|
||||
PlayGameSound(GameSounds.PlacementError.Sound,
|
||||
|
@ -1065,7 +1079,7 @@ local void EditorCallbackKeyDown(unsigned key, unsigned keychar)
|
|||
case 'S':
|
||||
case KeyCodeF11:
|
||||
//UiEnterSaveGameMenu();
|
||||
SavePud("freecraft.pud.gz",&TheMap);
|
||||
EditorSavePud("freecraft.pud.gz");
|
||||
SetStatusLine("Pud saved");
|
||||
break;
|
||||
|
||||
|
@ -1239,17 +1253,9 @@ local void EditorCallbackMouse(int x, int y)
|
|||
if (CanBuildUnitType(NULL, CursorBuilding,
|
||||
Viewport2MapX(TheUI.LastClickedVP, CursorX),
|
||||
Viewport2MapY(TheUI.LastClickedVP, CursorY))) {
|
||||
Unit* unit;
|
||||
|
||||
unit = MakeUnitAndPlace(Viewport2MapX(TheUI.LastClickedVP,
|
||||
CursorX), Viewport2MapY(TheUI.LastClickedVP, CursorY),
|
||||
EditUnit(Viewport2MapX(TheUI.LastClickedVP, CursorX),
|
||||
Viewport2MapY(TheUI.LastClickedVP, CursorY),
|
||||
CursorBuilding, Players + SelectedPlayer);
|
||||
if (unit->Type->OilPatch || unit->Type->GivesOil) {
|
||||
unit->Value = 50000;
|
||||
}
|
||||
if (unit->Type->GoldMine) {
|
||||
unit->Value = 100000;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1532,7 +1538,7 @@ local void CreateEditor(void)
|
|||
break;
|
||||
case PlayerRaceOrc:
|
||||
MakeUnitAndPlace(Players[i].StartX, Players[i].StartY,
|
||||
UnitTypeByWcNum(WC_StartLocationHuman), Players + i);
|
||||
UnitTypeByWcNum(WC_StartLocationOrc), Players + i);
|
||||
break;
|
||||
}
|
||||
} else if (Players[i].StartX | Players[i].StartY) {
|
||||
|
@ -1562,6 +1568,44 @@ local void CreateEditor(void)
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
** Save a pud from editor.
|
||||
**
|
||||
** @param file Save the level to this file.
|
||||
**
|
||||
** @todo FIXME: Check if the pud is valid, contains no failures.
|
||||
** Alteast two players, one human slot, every player a startpoint
|
||||
** ...
|
||||
*/
|
||||
local void EditorSavePud(const char *file)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NumUnits; ++i) {
|
||||
const UnitType *type;
|
||||
|
||||
type = Units[i]->Type;
|
||||
if (type == UnitTypeByWcNum(WC_StartLocationHuman)
|
||||
|| type == UnitTypeByWcNum(WC_StartLocationOrc)) {
|
||||
// FIXME: Startpoints sets the land-unit flag.
|
||||
TheMap.Fields[Units[i]->X + Units[i]->Y * TheMap.Width].Flags &=
|
||||
~MapFieldLandUnit;
|
||||
}
|
||||
}
|
||||
SavePud(file, &TheMap);
|
||||
for (i = 0; i < NumUnits; ++i) {
|
||||
const UnitType *type;
|
||||
|
||||
type = Units[i]->Type;
|
||||
if (type == UnitTypeByWcNum(WC_StartLocationHuman)
|
||||
|| type == UnitTypeByWcNum(WC_StartLocationOrc)) {
|
||||
// FIXME: Startpoints sets the land-unit flag.
|
||||
TheMap.Fields[Units[i]->X + Units[i]->Y * TheMap.Width].Flags |=
|
||||
MapFieldLandUnit;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
-- Editor main loop
|
||||
----------------------------------------------------------------------------*/
|
||||
|
|
Loading…
Add table
Reference in a new issue