Melnorme now are dynamic.

It seems that each Melnorme is distinct at each
system.  In my play-testing here, they stay dead if
killed.  Which is, well, sensible.

I don't remember if this was the behaviour in the original game.
This commit is contained in:
2024-04-27 17:48:59 -04:00
parent 476d49e267
commit 8ae8a15886
6 changed files with 158 additions and 151 deletions
+10 -12
View File
@@ -22,7 +22,6 @@
#include <stdlib.h>
extern GenerateFunctions generateMelnormeFunctions;
extern GenerateFunctions generateMyconFunctions;
extern GenerateFunctions generateOrzFunctions;
extern GenerateFunctions generateSolFunctions;
@@ -37,8 +36,17 @@ getGenerateFunctions (STAR_DESC *const star)
switch (star->Index)
{
// Legacy ones are disabled...
case RAINBOW_DEFINED:
case MELNORME0_DEFINED:
case MELNORME1_DEFINED:
case MELNORME2_DEFINED:
case MELNORME3_DEFINED:
case MELNORME4_DEFINED:
case MELNORME5_DEFINED:
case MELNORME6_DEFINED:
case MELNORME7_DEFINED:
case MELNORME8_DEFINED:
case RAINBOW_DEFINED:
case SAMATRA_DEFINED:
case ILWRATH_DEFINED:
case SPATHI_DEFINED:
@@ -65,16 +73,6 @@ getGenerateFunctions (STAR_DESC *const star)
case SOL_DEFINED:
return &generateSolFunctions;
case MELNORME0_DEFINED:
case MELNORME1_DEFINED:
case MELNORME2_DEFINED:
case MELNORME3_DEFINED:
case MELNORME4_DEFINED:
case MELNORME5_DEFINED:
case MELNORME6_DEFINED:
case MELNORME7_DEFINED:
case MELNORME8_DEFINED:
return &generateMelnormeFunctions;
case BOMB_DEFINED:
case UTWIG_DEFINED:
return &generateUtwigFunctions;
+12 -8
View File
@@ -542,30 +542,28 @@ STAR_DESC starmap_array[] =
{{ 522, 525}, MAKE_STAR (DWARF_STAR, YELLOW_BODY, -1), 0, 3, 92, "Pkunk"},
{{6858, 577}, MAKE_STAR (DWARF_STAR, GREEN_BODY, -1), 0, 0, 123, "Mycon Trap"},
{{4681, 916}, MAKE_STAR (DWARF_STAR, ORANGE_BODY, -1), 0, 6, 75, "Rainbow"},
{{9333, 937}, MAKE_STAR (SUPER_GIANT_STAR, YELLOW_BODY, -1), 0, 2, 5, "Melnorme", "0"},
{{1559, 993}, MAKE_STAR (SUPER_GIANT_STAR, RED_BODY, -1), 0, 1, 80, "Melnorme", "1"},
{{1004, 1083}, MAKE_STAR (DWARF_STAR, GREEN_BODY, -1), 0, 2, 27, "Slylandro"},
{{1776, 1395}, MAKE_STAR (DWARF_STAR, YELLOW_BODY, -1), 0, 0, 98, "Colony"},
{{1777, 1405}, MAKE_STAR (DWARF_STAR, YELLOW_BODY, -1), 0, 0, 99},
// ADAM ADDED
{{1703, 1432}, MAKE_STAR (GIANT_STAR, GREEN_BODY, -1), 0, 0, 171},
{{1752, 1450}, MAKE_STAR (DWARF_STAR, YELLOW_BODY, -1), SOL_DEFINED, 0, 129},
{{1848, 1469}, MAKE_STAR (DWARF_STAR, BLUE_BODY, -1), 0, 4, 82, "Shofixti"},
{{1751, 1479}, MAKE_STAR (GIANT_STAR, GREEN_BODY, -1), 0, 1, 59, "Wreck"},
{{1707, 1501}, MAKE_STAR (DWARF_STAR, GREEN_BODY, -1), 0, 0, 52},
{{3352, 1940}, MAKE_STAR (SUPER_GIANT_STAR, WHITE_BODY, -1), 0, 0, 97, "Melnorme", "2"},
{{2104, 2083}, MAKE_STAR (DWARF_STAR, ORANGE_BODY, -1), 0, 0, 118, "Zoq-Fot-Pik Scout"},
{{ 742, 2268}, MAKE_STAR (DWARF_STAR, ORANGE_BODY, -1), 0, 0, 117, "Chmmr"},
{{3587, 2566}, MAKE_STAR (DWARF_STAR, GREEN_BODY, -1), 0, 7, 86, "Androsynth"},
{{3654, 2587}, MAKE_STAR (SUPER_GIANT_STAR, GREEN_BODY, -1), 0, 1, 86, "Melnorme", "3"},
{{9469, 2806}, MAKE_STAR (DWARF_STAR, ORANGE_BODY, -1), 0, 6, 61, "Druuge"},
{{6020, 2979}, MAKE_STAR (DWARF_STAR, ORANGE_BODY, -1), 0, 3, 13, "Rainbow"},
{{2354, 3291}, MAKE_STAR (SUPER_GIANT_STAR, RED_BODY, -1), 0, 1, 106, "Melnorme", "4"},
{{ 229, 3666}, MAKE_STAR (DWARF_STAR, GREEN_BODY, -1), 0, 1, 76, "Ilwrath"},
{{2416, 3687}, MAKE_STAR (GIANT_STAR, ORANGE_BODY, -1), 0, 5, 109, "Spathiwa"},
{{4125, 3770}, MAKE_STAR (DWARF_STAR, BLUE_BODY, -1), 0, 0, 114, "Syreen Gaia"},
@@ -577,16 +575,22 @@ STAR_DESC starmap_array[] =
{{6200, 5935}, MAKE_STAR (DWARF_STAR, YELLOW_BODY, -1), 0, 4, 21, "Sa-Matra"},
{{1978, 5968}, MAKE_STAR (DWARF_STAR, GREEN_BODY, -1), 0, 2, 54, "Umgah and Talking Pet"},
{{1578, 6668}, MAKE_STAR (SUPER_GIANT_STAR, GREEN_BODY, -1), 0, 1, 56, "Melnorme", "5"},
{{8625, 7000}, MAKE_STAR (DWARF_STAR, GREEN_BODY, -1), 0, 1, 41, "Rainbow"},
{{ 395, 7458}, MAKE_STAR (DWARF_STAR, BLUE_BODY, -1), 0, 2, 60, "Rainbow"},
{{5875, 7729}, MAKE_STAR (SUPER_GIANT_STAR, YELLOW_BODY, -1), 0, 1, 34, "Melnorme", "6"},
{{2836, 7857}, MAKE_STAR (DWARF_STAR, WHITE_BODY, -1), 0, 5, 53, "Rainbow"},
{{5437, 8270}, MAKE_STAR (DWARF_STAR, RED_BODY, -1), 0, 5, 48, "Rainbow"},
{{2582, 8507}, MAKE_STAR (SUPER_GIANT_STAR, YELLOW_BODY, -1), 0, 1, 2, "Melnorme", "7"},
{{7666, 8666}, MAKE_STAR (DWARF_STAR, ORANGE_BODY, -1), 0, 2, 46, "Rainbow"},
{{8534, 8797}, MAKE_STAR (DWARF_STAR, ORANGE_BODY, -1), 0, 3, 3, "Rainbow"},
{{9960, 9042}, MAKE_STAR (GIANT_STAR, WHITE_BODY, -1), 0, 0, 42, "Rainbow"},
{{7414, 9124}, MAKE_STAR (DWARF_STAR, GREEN_BODY, -1), 0, 2, 47, "Supox"},
{{9159, 9745}, MAKE_STAR (SUPER_GIANT_STAR, BLUE_BODY, -1), 0, 1, 4, "Melnorme", "8"},
{{MAX_X_UNIVERSE << 1, MAX_Y_UNIVERSE << 1}, 0, 0, 0, 0},
+2 -2
View File
@@ -1,5 +1,5 @@
uqm_CFILES="gendefault.c
genmel.c genmyc.c genorz.c
genmyc.c genorz.c
gensol.c
genthrad.c genutw.c genvux.c"
uqm_HFILES="genall.h gendefault.h"
@@ -10,4 +10,4 @@ uqm_CXXFILES="cxx-generator.cpp gensly-modern.cpp genshof-modern.cpp
gentrap-modern.cpp gensup-modern.cpp genspa-modern.cpp
genpet-modern.cpp genzoq-modern.cpp genyeh-modern.cpp
genilw-modern.cpp genpku-modern.cpp gensam-modern.cpp
genrain-modern.cpp"
genrain-modern.cpp genmel-modern.cpp"
@@ -0,0 +1,133 @@
//Copyright Paul Reiche, Fred Ford. 1992-2002
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "genall.h"
#include "../../build.h"
#include "../../gendef.h"
#include "../../starmap.h"
#include "../../globdata.h"
#include "../../state.h"
#include "libs/log.h"
#include <sstream>
#include <iostream>
#include <map>
namespace
{
using namespace std::literals::string_literals;
using namespace Planets::exports;
template< typename T >
T
lexical_cast( const std::string &s )
{
std::istringstream iss{ s };
iss.exceptions( std::istream::failbit | std::istream::badbit );
T rv;
iss >> rv;
return rv;
}
class GenerateMelnorme
: public DefaultGenerator
{
void initNpcs( SolarSystem *solarSys ) override;
static int SelectMelnormeRefVar();
static DWORD GetMelnormeRef();
static void SetMelnormeRef( DWORD Ref );
};
auto init= []
{
Generator::add( "Melnorme", std::make_unique< GenerateMelnorme >() );
return 0xDEADBEEF;
}();
}
void
GenerateMelnorme::initNpcs( SolarSystem *const solarSys )
{
GLOBAL (BattleGroupRef) = GetMelnormeRef ();
if (GLOBAL (BattleGroupRef) == 0)
{
CloneShipFragment (MELNORME_SHIP, &GLOBAL (npc_built_ship_q), 0);
GLOBAL (BattleGroupRef) = PutGroupInfo (GROUPS_ADD_NEW, 1);
ReinitQueue (&GLOBAL (npc_built_ship_q));
SetMelnormeRef (GLOBAL (BattleGroupRef));
}
DefaultGenerator::initNpcs (solarSys);
}
int
GenerateMelnorme::SelectMelnormeRefVar()
{
const auto arg_p= CurStarDescPtr->supArg;
const std::string arg= arg_p ? arg_p : "";
static const std::map< std::string, int > lookups
{
{ "0"s, MELNORME0_GRPOFFS0 },
{ "1"s, MELNORME1_GRPOFFS0 },
{ "2"s, MELNORME2_GRPOFFS0 },
{ "3"s, MELNORME3_GRPOFFS0 },
{ "4"s, MELNORME4_GRPOFFS0 },
{ "5"s, MELNORME5_GRPOFFS0 },
{ "6"s, MELNORME6_GRPOFFS0 },
{ "7"s, MELNORME7_GRPOFFS0 },
{ "8"s, MELNORME8_GRPOFFS0 },
};
if( not lookups.count( arg ) ) return -1;
return lookups.at( arg );
}
DWORD
GenerateMelnorme::GetMelnormeRef()
{
int RefVar = SelectMelnormeRefVar ();
if (RefVar < 0)
{
log_add (log_Warning, "GetMelnormeRef(): reference unknown");
return 0;
}
return GET_GAME_STATE_32 (RefVar);
}
void
GenerateMelnorme::SetMelnormeRef( DWORD Ref )
{
int RefVar = SelectMelnormeRefVar ();
if (RefVar < 0)
{
log_add (log_Warning, "SetMelnormeRef(): reference unknown");
return;
}
SET_GAME_STATE_32 (RefVar, Ref);
}
-114
View File
@@ -1,114 +0,0 @@
//Copyright Paul Reiche, Fred Ford. 1992-2002
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "genall.h"
#include "../../build.h"
#include "../../gendef.h"
#include "../../starmap.h"
#include "../../globdata.h"
#include "../../state.h"
#include "libs/log.h"
static bool GenerateMelnorme_initNpcs (SOLARSYS_STATE *solarSys);
static int SelectMelnormeRefVar (void);
static DWORD GetMelnormeRef (void);
static void SetMelnormeRef (DWORD Ref);
const GenerateFunctions generateMelnormeFunctions = {
/* .initNpcs = */ GenerateMelnorme_initNpcs,
/* .reinitNpcs = */ GenerateDefault_reinitNpcs,
/* .uninitNpcs = */ GenerateDefault_uninitNpcs,
/* .generatePlanets = */ GenerateDefault_generatePlanets,
/* .generateMoons = */ GenerateDefault_generateMoons,
/* .generateName = */ GenerateDefault_generateName,
/* .generateOrbital = */ GenerateDefault_generateOrbital,
/* .generateMinerals = */ GenerateDefault_generateMinerals,
/* .generateEnergy = */ GenerateDefault_generateEnergy,
/* .generateLife = */ GenerateDefault_generateLife,
/* .pickupMinerals = */ GenerateDefault_pickupMinerals,
/* .pickupEnergy = */ GenerateDefault_pickupEnergy,
/* .pickupLife = */ GenerateDefault_pickupLife,
};
static bool
GenerateMelnorme_initNpcs (SOLARSYS_STATE *solarSys)
{
GLOBAL (BattleGroupRef) = GetMelnormeRef ();
if (GLOBAL (BattleGroupRef) == 0)
{
CloneShipFragment (MELNORME_SHIP, &GLOBAL (npc_built_ship_q), 0);
GLOBAL (BattleGroupRef) = PutGroupInfo (GROUPS_ADD_NEW, 1);
ReinitQueue (&GLOBAL (npc_built_ship_q));
SetMelnormeRef (GLOBAL (BattleGroupRef));
}
GenerateDefault_initNpcs (solarSys);
return true;
}
static int
SelectMelnormeRefVar (void)
{
switch (CurStarDescPtr->Index)
{
case MELNORME0_DEFINED: return MELNORME0_GRPOFFS0;
case MELNORME1_DEFINED: return MELNORME1_GRPOFFS0;
case MELNORME2_DEFINED: return MELNORME2_GRPOFFS0;
case MELNORME3_DEFINED: return MELNORME3_GRPOFFS0;
case MELNORME4_DEFINED: return MELNORME4_GRPOFFS0;
case MELNORME5_DEFINED: return MELNORME5_GRPOFFS0;
case MELNORME6_DEFINED: return MELNORME6_GRPOFFS0;
case MELNORME7_DEFINED: return MELNORME7_GRPOFFS0;
case MELNORME8_DEFINED: return MELNORME8_GRPOFFS0;
default:
return -1;
}
}
static DWORD
GetMelnormeRef (void)
{
int RefVar = SelectMelnormeRefVar ();
if (RefVar < 0)
{
log_add (log_Warning, "GetMelnormeRef(): reference unknown");
return 0;
}
return GET_GAME_STATE_32 (RefVar);
}
static void
SetMelnormeRef (DWORD Ref)
{
int RefVar = SelectMelnormeRefVar ();
if (RefVar < 0)
{
log_add (log_Warning, "SetMelnormeRef(): reference unknown");
return;
}
SET_GAME_STATE_32 (RefVar, Ref);
}
@@ -23,7 +23,6 @@
#include "../../globdata.h"
#include "libs/mathlib.h"
#include <sstream>
#include <iostream>
namespace
@@ -31,19 +30,6 @@ namespace
using namespace std::literals::string_literals;
using namespace Planets::exports;
template< typename T >
T
lexical_cast( const std::string &s )
{
std::istringstream iss{ s };
iss.exceptions( std::istream::failbit | std::istream::badbit );
T rv;
iss >> rv;
return rv;
}
class GenerateRainbowWorld
: public DefaultGenerator
{
@@ -107,7 +93,7 @@ GenerateRainbowWorld::generateOrbital( SolarSystem *const solarSys, PLANET_DESC
++which_rainbow;
++SDPtr;
}
std::cerr << "I think I'm at Rainbow world " << which_rainbow << std::endl;
std::cerr << "I think I'm at Rainbow world #" << (int) which_rainbow << std::endl;
rainbow_mask |= 1 << which_rainbow;
SET_GAME_STATE (RAINBOW_WORLD0, LOBYTE (rainbow_mask));
SET_GAME_STATE (RAINBOW_WORLD1, HIBYTE (rainbow_mask));