Hellway Invasion (a new invasion engine)

Maps, modifications, add-ons, projects, and other releases for Zandronum. Also includes announcers.
Post Reply
User avatar
arkore
Forum Regular
Posts: 183
Joined: Mon Dec 17, 2012 8:01 pm

Hellway Invasion (a new invasion engine)

#1

Post by arkore » Tue Oct 07, 2014 6:24 am

A new Invasion engine.

Image



Custom invasion engine, for Zandronum.



Download:
Note: Currently, this mod comes in 3 parts:
Core (engine): kwhr09c.pk3
Maps: krhw09-maps.pk3
Music: kwhw02-msx.pk3

More Downloads:
Brutal Doom (brutal v19) Compatibility Patch: krhwbd06-compat.pk3
Complex Doom (complex v22b2) Compatibility Patch: krhwcd02-compat.pk3

Brutal Doom (brutal v19) Janitor: janitormodeforbdv1.pk3
Complex Doom (complex v22b2) Janitor: krhwcd-janitor.pk3


How it works:
  • Single team of players must survive a series of waves of enemies.
  • Items (incl. Weapons) are unlocked each wave.
  • Random Power-up will spawn every 60 seconds.
Video:


Features:
  • Sub-waves system.
  • Monster groups system.
  • Spawning system.
  • Power-up system.
  • Items system.
  • Lives (per Wave) system.
Maps:

Code: Select all

MAP32 "Hellway"
Servers:
  • [bad site]:15004
  • [bad site]:15005 (Brutal Doom)
  • [bad site]:15006 (Complex Doom)
  • NOTE: If server is down, then search servers for "Hellway Invasion"
If you'd like to run your own server, here is the config you would use:

Server Config
krhellway.cfg

Code: Select all

// Message of the day
sv_motd "Hellway v1.0"

// ----------------------------------------------------------------------------
// REQUIRED SETTINGS (Hellway)
// ----------------------------------------------------------------------------
// Flags
sv_defaultdmflags 0 // Force use dmflags we want; don't set any defaults.
compatflags 0 // Reset the compat flags.

// Game-mode
deathmatch 0 // Co-op
cooperative 1 // Co-op
survival 0 // Co-op
teamgame 0 // Co-op
teamdamage 0.0 // No team damage.

// Skill
skill 3 // Skill: Ultra

// Number of Players
sv_maxplayers 8 // Max players to join.
sv_maxclients 16 // Max players to connect.
sv_maxlives 1 // Set maximum number of lives per player

// Items
sv_itemrespawn true // Items will respawn.
sv_norespawninvul false // Allow temporary god-mode after respawning.
sv_respawnsuper false // Disallow respawning powerups.
sv_doubleammo true // Double ammo.
sv_weaponstay true // Weapons stay.
sv_nodrop true // Disallow weapon/item dropping.
sv_coop_halveammo true // Players lose half ammo when dying.

// Score-board
sv_awarddamageinsteadkills true // Award points by damage done, rather frags.

// Bots
sv_disallowbots true // Disallow bots.



// ----------------------------------------------------------------------------
// OPTIONAL SETTINGS
// ----------------------------------------------------------------------------
// Voting
sv_nocallvote false // Allow voting.
sv_nomapvote false // Allow voting the map.
sv_nochangemapvote true // No voting change map.
sv_nopointlimitvote true // No voting the point limit.
sv_notimelimitvote true // No voting the time limit.

// Aiming
sv_nofreelook false // Allow players to mouse aim vertically.
sv_noautoaim true // Disable auto-aiming.
sv_bfgfreeaim true // Allow BFG to be fired vertically.
sv_smartaim 2 // Auto-aim will never aim at friends.

// Jumping
sv_nojump false // Allow jumping.

// Respawning
sv_norespawn false // Allow player to remain dead.
sv_forcerespawn true // Don't force player to respawn.

// Suiciding
sv_nokill true // Disallow player to kill himself.
sv_disallowsuicide true // Disallow suicides.

// Blocking
sv_unblockplayers true // Players won't collide with eachother.

// Maps
sv_maprotation true
addmap map32

Settings (ACS-based):

Code: Select all

#library "HWSETTINGS"
#include "zcommon.acs"

/* ****************************************************************************
// Defines
// ***************************************************************************/
// NOTE:
// Use "str" because glitch/confict in string defines dictionary between
// ACS (here) and the Map's ACS.

// Monster groups
// --------------
// Used in your waves' settings.  Change them to whatever you want, and then
// adjust your waves' settings accordingly to use them.
str MONSTER_ZOMBIE1_CLASSNAME = "ZombieMan";
str MONSTER_ZOMBIE2_CLASSNAME = "ShotgunGuy";
str MONSTER_ZOMBIE3_CLASSNAME = "ChaingunGuy";
// str MONSTER_ZOMBIE4_CLASSNAME = "SuperShotgunGuy";

str MONSTER_IMP1_CLASSNAME = "DoomImp";
// str MONSTER_IMP2_CLASSNAME = "DarkImp";

str MONSTER_DEMON1_CLASSNAME = "Demon";
// str MONSTER_DEMON2_CLASSNAME = "BloodDemon";

str MONSTER_CACODEMON1_CLASSNAME = "Cacodemon";
// str MONSTER_CACODEMON2_CLASSNAME = "Cacolantern";
// str MONSTER_CACODEMON3_CLASSNAME = "Abaddon";

str MONSTER_BARON1_CLASSNAME = "HellKnight";
str MONSTER_BARON2_CLASSNAME = "BaronOfHell";
// str MONSTER_BARON3_CLASSNAME = "Belphegor";

str MONSTER_ELEMENTAL1_CLASSNAME = "LostSoul";
str MONSTER_ELEMENTAL2_CLASSNAME = "PainElemental";
str MONSTER_ELEMENTAL3_CLASSNAME = "Revenant";

str MONSTER_FATSO1_CLASSNAME = "Fatso";
// str MONSTER_FATSO2_CLASSNAME = "Hectebus";

str MONSTER_ARCHVILE1_CLASSNAME = "Archvile";

str MONSTER_SPIDER1_CLASSNAME = "Arachnotron";
str MONSTER_SPIDER2_CLASSNAME = "SpiderMastermind";

str MONSTER_CYBERDEMON1_CLASSNAME = "Cyberdemon";



/* ****************************************************************************
// Global Variables.
// ***************************************************************************/
// Do not modify this section.

// Waves
global int 1:num_of_waves;
global int 2:num_of_spawns;
global int 3:num_of_powerup_spawns;
global int 4:wave_num_of_grps[];
global int 5:wave_grp[];
global int 6:wave_grp_amt[];
global int 7:wave_grp_num_of_subwaves[];
global int 8:wave_grp_subwave_delay[];

// Reserved
global int 9:base_index;

// Unlocks
global int 10:wave_unlock_weapons[];
global int 11:wave_unlock_ammos[];
global int 12:wave_unlock_healths[];
global int 13:wave_unlock_powerups[];

// Reserved
global int 14:reserved_14;
global int 15:reserved_15;
global int 16:reserved_16;
global int 17:reserved_17;
global int 18:reserved_18;
global int 19:reserved_19;

// Weapons
global int 20:weapons[];
global int 21:num_of_weapons;

// Ammo
global int 22:ammos[];
global int 23:num_of_ammos;

// Health/Armor
global int 24:healths[];
global int 25:num_of_healths;

// Power-ups
global int 26:powerups[];
global int 27:num_of_powerups;

// Delays
global int 28:powerup_delay;

// Reserved
global int 29:reserved_29;

// Spawn-point assignments.
global int 30:num_of_weapon_spawns; // Not used.
global int 31:num_of_ammo_spawns;
global int 32:num_of_health_spawns;

// Reserved
global int 33:reserved_33;

// Spawn-point assignments.
global int 34:weapon_spawns[]; // Not used.
global int 35:ammo_spawns[];
global int 36:health_spawns[];

// Reserved
global int 37:powerup_spawns[];
global int 38:reserved_38;
global int 39:reserved_39;



/* ****************************************************************************
// Debug (optional)
// ***************************************************************************/
// Debug mechanism for testing your map.  For example, you could have a
// clause (e.g. "if (debug) { ... }") of code for executing different wave
// settings.
//
// This used to be a boolean variable, but having it as an integer allows for
// multiple levels of debugging.  It's really up to you how you choose to use
// this, or not use it all.

// Debug
int debug = 0; // 1 = Standard (Level 1), 2 = Level 2, 3 = Level 3.




script 9 OPEN {
    /* ************************************************************************
    // Item Settings
    // ***********************************************************************/
    // Number of weapons
    // -----------------
    // Increase/decrease this # any time you add or remove weapons to
    // your weapons list (below).
    num_of_weapons = 8;

    // Weapons
    // -------
    // For the weapon spawning system.
    //
    // weapons[# * # + #]
    //
    // The first # is the total number of weapons.  Do not change this.
    // The second # is the weapon #.
    // The third # (ranging 1 - 2) is used
    // internally. (1 = classname, 2 = text.(not used))
    weapons[num_of_weapons * 1 + 1] = "Pistol";
    weapons[num_of_weapons * 1 + 2] = "Pistol";
    weapons[num_of_weapons * 2 + 1] = "Shotgun";
    weapons[num_of_weapons * 2 + 2] = "Shotgun";
    weapons[num_of_weapons * 3 + 1] = "Supershotgun";
    weapons[num_of_weapons * 3 + 2] = "Super Shotgun";
    weapons[num_of_weapons * 4 + 1] = "Chaingun";
    weapons[num_of_weapons * 4 + 2] = "Chaingun";
    weapons[num_of_weapons * 5 + 1] = "Chainsaw";
    weapons[num_of_weapons * 5 + 2] = "Chainsaw";
    weapons[num_of_weapons * 6 + 1] = "Rocketlauncher";
    weapons[num_of_weapons * 6 + 2] = "Rocket Launcher";
    weapons[num_of_weapons * 7 + 1] = "PlasmaRifle";
    weapons[num_of_weapons * 7 + 2] = "Plasmagun";
    weapons[num_of_weapons * 8 + 1] = "BFG9000";
    weapons[num_of_weapons * 8 + 2] = "BFG9000";



    // Number of ammos
    // ---------------
    // Increase/decrease this # any time you add or remove ammo to
    // your ammos list (below).
    num_of_ammos = 5;

    // Ammos
    // -----
    // For the ammo spawning system.
    //
    // ammos[# * # + #]
    //
    // The first # is the total number of ammos.  Do not change this.
    // The second # is the ammo #.
    // The third # (ranging 1 - 2) is used
    // internally. (1 = classname, 2 = text.(not used))
    ammos[num_of_ammos * 1 + 1] = "ShellBox";
    ammos[num_of_ammos * 1 + 2] = "Shells";
    ammos[num_of_ammos * 2 + 1] = "ClipBox";
    ammos[num_of_ammos * 2 + 2] = "Bullets";
    ammos[num_of_ammos * 3 + 1] = "RocketBox";
    ammos[num_of_ammos * 3 + 2] = "Rockets";
    ammos[num_of_ammos * 4 + 1] = "CellPack";
    ammos[num_of_ammos * 4 + 2] = "Cells";
    ammos[num_of_ammos * 5 + 1] = "Backpack";
    ammos[num_of_ammos * 5 + 2] = "Backpack";



    // Number of healths
    // -----------------
    // Increase/decrease this # any time you add or remove health to
    // your healths list (below).
    num_of_healths = 2;

    // Healths
    // -------
    // For the health spawning system.
    //
    // healths[# * # + #]
    //
    // The first # is the total number of healths.  Do not change this.
    // The second # is the health #.
    // The third # (ranging 1 - 2) is used
    // internally. (1 = classname, 2 = text.(not used))
    healths[num_of_healths * 1 + 1] = "BlueArmor";
    healths[num_of_healths * 1 + 2] = "Armor";
    healths[num_of_healths * 2 + 1] = "Medikit";
    healths[num_of_healths * 2 + 2] = "Health";


    // Number of power-ups
    // -------------------
    // Increase/decrease this # any time you add or remove power-ups to
    // your items list (below).
    num_of_powerups = 4;

    // Power-ups
    // ---------
    // For the random power-up spawning system.
    //
    // powerups[# * # + #]
    //
    // The first # is the total number of power-ups.  Do not change this.
    // The second # is the power-up #.
    // The third # (ranging 1 - 2) is used
    // internally. (1 = classname, 2 = % chance of successfully spawning.)
    powerups[num_of_powerups * 1 + 1] = "BlurSphere";
    powerups[num_of_powerups * 1 + 2] = 100;
    powerups[num_of_powerups * 2 + 1] = "InvulnerabilitySphere";
    powerups[num_of_powerups * 2 + 2] = 25;
    powerups[num_of_powerups * 3 + 1] = "Megasphere";
    powerups[num_of_powerups * 3 + 2] = 75;
    powerups[num_of_powerups * 4 + 1] = "Soulsphere";
    powerups[num_of_powerups * 4 + 2] = 75;
    // powerups[num_of_powerups * 5 + 1] = "Guardsphere";
    // powerups[num_of_powerups * 5 + 2] = 75;
    // powerups[num_of_powerups * 6 + 1] = "Timefreezesphere";
    // powerups[num_of_powerups * 6 + 2] = 35;
    // powerups[num_of_powerups * 7 + 1] = "Doomsphere";
    // powerups[num_of_powerups * 7 + 2] = 35;
    // powerups[num_of_powerups * 8 + 1] = "Turbosphere";
    // powerups[num_of_powerups * 8 + 2] = 50;

    // Power-up rotation/spawn delay
    // -----------------------------
    // The # of seconds in delay until the next power-up spawn occurs.
    powerup_delay = 60;

    // Numer of power-up spawn-points
    // ------------------------------
    // You must set the # of spawnpoints that your map will have, for
    // the random power-up spawning system.
    num_of_powerup_spawns = 30;



    /* ************************************************************************
    // Map Settings
    // ***********************************************************************/
    // Map number.
    int lvlnum = GetLevelInfo(LEVELINFO_LEVELNUM);
    switch(lvlnum) {

    ///////////////////////////////////////////////////////////////////
    // MAP1
    ///////////////////////////////////////////////////////////////////
    case 1:
    break;

    // ...

    ///////////////////////////////////////////////////////////////////
    // MAP32
    ///////////////////////////////////////////////////////////////////
    // case 1: // Use same settings as map32? (no "break;")
    // case 2: // Use same settings as map32? (no "break;")
    // ...
    case 32:
    /* ************************************************************************
    // Item Spawn Settings
    // ***********************************************************************/

    // (OPTIONAL)
    // Number of ammo spawn-points
    // ---------------------------
    // Increase/decrease this # any time you add or remove items to your
    // ammo spawn-points list (below).
    //
    // IMPORTANT:
    // If you aren't going to declare ammo spawns (below), then set this to 0.
    num_of_ammo_spawns = 4;

    // Ammo spawns
    // -----------
    // For the item spawning system.
    //
    // ammo_spawns[# * # + #]
    //
    // The first # is the total number of ammo spawns.  Do not change this.
    // The second # is The ammo #. See ammos[] in hwitems.acs for details.
    // The third # is (ranging 1 - *) is the specific MapSpot TID.

    // ClipBox spawn-points.
    ammo_spawns[num_of_ammo_spawns * 1 + 1] = 1; // 31801
    ammo_spawns[num_of_ammo_spawns * 1 + 2] = 6; // 31806

    // ShellBox spawn-points.
    ammo_spawns[num_of_ammo_spawns * 2 + 1] = 2; // 31802
    ammo_spawns[num_of_ammo_spawns * 2 + 2] = 7; // 31807

    // RocketBox spawn-points.
    ammo_spawns[num_of_ammo_spawns * 3 + 1] = 3; // 31803
    ammo_spawns[num_of_ammo_spawns * 3 + 2] = 8; // 31808

    // CellPack spawn-points.
    ammo_spawns[num_of_ammo_spawns * 4 + 1] = 4; // 31804
    ammo_spawns[num_of_ammo_spawns * 4 + 2] = 9; // 31809

    // Backpack spawn-points.
    ammo_spawns[num_of_ammo_spawns * 5 + 1] = 5; // 31805
    ammo_spawns[num_of_ammo_spawns * 5 + 2] = 10; // 31810



    // (OPTIONAL)
    // Number of health spawn-points
    // -----------------------------
    // Increase/decrease this # any time you add or remove items to your
    // health spawn-points list (below).
    //
    // IMPORTANT:
    // If you aren't going to declare ammo spawns (below), then set this to 0.
    num_of_health_spawns = 2;

    // Health/Armor spawns
    // -------------------
    // For the item spawning system.
    //
    // health_spawns[# * # + #]
    //
    // The first # is the total number of health spawns.  Do not change this.
    // The second # is The health #. See health[] in hwitems.acs for details.
    // The third # is (ranging 1 - *) is the specific MapSpot TID.

    // BlueArmor spawn-points.
    health_spawns[num_of_health_spawns * 1 + 1] = 1; // 31701

    // Medikit spawn-points.
    health_spawns[num_of_health_spawns * 2 + 1] = 2; // 31702
    health_spawns[num_of_health_spawns * 2 + 2] = 3; // 31703



    /* ************************************************************************
    // Wave Settings
    // ***********************************************************************/
    // Base index:
    // If you ever plan to have 100 waves or more, and you're configuring one
    // of those hundred waves to have 100 monster groups or more, then you
    // should increase this number.
    base_index = 100; // Used for indexing.

    // Numer of monsters spawn-points
    // ------------------------------
    // You must set the # of spawnpoints that your map will have, for
    // the monster spawning system.
    num_of_spawns = 8;

    // Number of waves
    // ---------------
    // The number of waves your map will have.
    num_of_waves = 11;

    // NOTE **********************************************************/
    // Due to recent last minute change, all wave group amt
    // values (below) are now hard-coded to be doubled.  They
    // will no longer be double by # of players joined.
    // e.g. If you set a wave's group amount to be 10, then
    // it will actually be 20.

    // Wave 1: # of monster groups.
    wave_num_of_grps[1] = 2;

    // Wave 1: monster groups.
    wave_grp[base_index * 1 + 1] = MONSTER_ZOMBIE1_CLASSNAME;
    wave_grp[base_index * 1 + 2] = MONSTER_ZOMBIE2_CLASSNAME;

    // Wave 1: # of monsters per group.
    wave_grp_amt[base_index * 1 + 1] = 20;
    wave_grp_amt[base_index * 1 + 2] = 20;

    // Wave 1: # of sub-waves per group.
    wave_grp_num_of_subwaves[base_index * 1 + 1] = 2;
    wave_grp_num_of_subwaves[base_index * 1 + 2] = 2;

    // Wave 1: # of seconds delay between sub-waves.
    wave_grp_subwave_delay[base_index * 1 + 1] = 15;
    wave_grp_subwave_delay[base_index * 1 + 2] = 30;

    // Unlock items
    //
    // wave_unlock_item[# * # + #]
    //
    // The first # is the total number of waves.  Do not change this.
    // The second # is The wave #.
    // The third # is the index.
    wave_unlock_weapons[num_of_weapons * 1 + 1] = 1; // Pistol
    // wave_unlock_weapons[num_of_weapons * 1 + 2] = 2; // Shotgun
    // wave_unlock_ammos[num_of_ammos * 1 + 1] = 5; // Backpack
    wave_unlock_healths[num_of_healths * 1 + 1] = 1; // BlueArmor
    wave_unlock_healths[num_of_healths * 1 + 2] = 2; // Medikit
    // wave_unlock_powerups[num_of_powerups * 1 + 1] = 1; // Blursphere

    // ------------------------------------------------------------------------

    // Wave 2: # of monster groups.
    wave_num_of_grps[2] = 3;

    // Wave 2: monster groups.
    wave_grp[base_index * 2 + 1] = MONSTER_ZOMBIE1_CLASSNAME;
    wave_grp[base_index * 2 + 2] = MONSTER_ZOMBIE2_CLASSNAME;
    wave_grp[base_index * 2 + 3] = MONSTER_ZOMBIE3_CLASSNAME;

    // Wave 2: # of monsters per group.
    wave_grp_amt[base_index * 2 + 1] = 20;
    wave_grp_amt[base_index * 2 + 2] = 10;
    wave_grp_amt[base_index * 2 + 3] = 10;

    // Wave 2: # of sub-waves per group.
    wave_grp_num_of_subwaves[base_index * 2 + 1] = 1;
    wave_grp_num_of_subwaves[base_index * 2 + 2] = 1;
    wave_grp_num_of_subwaves[base_index * 2 + 3] = 1;

    // Wave 2: # of seconds delay between sub-waves.
    wave_grp_subwave_delay[base_index * 2 + 1] = 0;
    wave_grp_subwave_delay[base_index * 2 + 2] = 0;
    wave_grp_subwave_delay[base_index * 2 + 3] = 0;

    // Unlock items
    //
    // wave_unlock_item[# * # + #]
    //
    // The first # is the total number of waves.  Do not change this.
    // The second # is The wave #.
    // The third # is the index.
    wave_unlock_weapons[num_of_weapons * 2 + 1] = 2; // Shotgun
    wave_unlock_ammos[num_of_ammos * 2 + 1] = 1; // ShellBox

    // ------------------------------------------------------------------------

    // Wave 3: # of monster groups.
    wave_num_of_grps[3] = 3;

    // Wave 3: monster groups.
    wave_grp[base_index * 3 + 1] = MONSTER_ZOMBIE1_CLASSNAME;
    wave_grp[base_index * 3 + 2] = MONSTER_ZOMBIE2_CLASSNAME;
    wave_grp[base_index * 3 + 3] = MONSTER_ZOMBIE3_CLASSNAME;

    // Wave 3: # of monsters per group.
    wave_grp_amt[base_index * 3 + 1] = 10;
    wave_grp_amt[base_index * 3 + 2] = 20;
    wave_grp_amt[base_index * 3 + 3] = 20;

    // Wave 3: # of sub-waves per group.
    wave_grp_num_of_subwaves[base_index * 3 + 1] = 2;
    wave_grp_num_of_subwaves[base_index * 3 + 2] = 2;
    wave_grp_num_of_subwaves[base_index * 3 + 3] = 2;

    // Wave 3: # of seconds delay between sub-waves.
    wave_grp_subwave_delay[base_index * 3 + 1] = 15;
    wave_grp_subwave_delay[base_index * 3 + 2] = 15;
    wave_grp_subwave_delay[base_index * 3 + 3] = 15;

    // Unlock items
    //
    // wave_unlock_item[# * # + #]
    //
    // The first # is the total number of waves.  Do not change this.
    // The second # is The wave #.
    // The third # is the index.
    wave_unlock_weapons[num_of_weapons * 3 + 1] = 3; // Supershotgun

    // ------------------------------------------------------------------------

    // Wave 4: # of monster groups.
    wave_num_of_grps[4] = 5;

    // Wave 4: monster groups.
    wave_grp[base_index * 4 + 1] = MONSTER_ZOMBIE2_CLASSNAME;
    wave_grp[base_index * 4 + 2] = MONSTER_ZOMBIE3_CLASSNAME;
    wave_grp[base_index * 4 + 3] = MONSTER_IMP1_CLASSNAME;
    wave_grp[base_index * 4 + 4] = MONSTER_DEMON1_CLASSNAME;
    wave_grp[base_index * 4 + 5] = MONSTER_BARON1_CLASSNAME;

    // Wave 4: # of monsters per group.
    wave_grp_amt[base_index * 4 + 1] = 5;
    wave_grp_amt[base_index * 4 + 2] = 10;
    wave_grp_amt[base_index * 4 + 3] = 10;
    wave_grp_amt[base_index * 4 + 4] = 10;
    wave_grp_amt[base_index * 4 + 5] = 6;

    // Wave 4: # of sub-waves per group.
    wave_grp_num_of_subwaves[base_index * 4 + 1] = 1;
    wave_grp_num_of_subwaves[base_index * 4 + 2] = 2;
    wave_grp_num_of_subwaves[base_index * 4 + 3] = 2;
    wave_grp_num_of_subwaves[base_index * 4 + 4] = 2;
    wave_grp_num_of_subwaves[base_index * 4 + 5] = 2;

    // Wave 4: # of seconds delay between sub-waves.
    wave_grp_subwave_delay[base_index * 4 + 1] = 0;
    wave_grp_subwave_delay[base_index * 4 + 2] = 30;
    wave_grp_subwave_delay[base_index * 4 + 3] = 30;
    wave_grp_subwave_delay[base_index * 4 + 4] = 30;
    wave_grp_subwave_delay[base_index * 4 + 5] = 30;

    // Unlock items
    //
    // wave_unlock_item[# * # + #]
    //
    // The first # is the total number of waves.  Do not change this.
    // The second # is The wave #.
    // The third # is the index.
    wave_unlock_weapons[num_of_weapons * 4 + 1] = 4; // Chaingun
    wave_unlock_ammos[num_of_ammos * 4 + 1] = 2; // ClipBox
    wave_unlock_ammos[num_of_ammos * 4 + 2] = 5; // Backpack

    // ------------------------------------------------------------------------

    // Wave 5: # of monster groups.
    wave_num_of_grps[5] = 5;

    // Wave 5: monster groups.
    wave_grp[base_index * 5 + 1] = MONSTER_ZOMBIE3_CLASSNAME;
    wave_grp[base_index * 5 + 2] = MONSTER_IMP1_CLASSNAME;
    wave_grp[base_index * 5 + 3] = MONSTER_DEMON1_CLASSNAME;
    wave_grp[base_index * 5 + 4] = MONSTER_BARON1_CLASSNAME;
    wave_grp[base_index * 5 + 5] = MONSTER_BARON2_CLASSNAME;

    // Wave 5: # of monsters per group.
    wave_grp_amt[base_index * 5 + 1] = 5;
    wave_grp_amt[base_index * 5 + 2] = 5;
    wave_grp_amt[base_index * 5 + 3] = 20;
    wave_grp_amt[base_index * 5 + 4] = 3;
    wave_grp_amt[base_index * 5 + 5] = 2;

    // Wave 5: # of sub-waves per group.
    wave_grp_num_of_subwaves[base_index * 5 + 1] = 1;
    wave_grp_num_of_subwaves[base_index * 5 + 2] = 1;
    wave_grp_num_of_subwaves[base_index * 5 + 3] = 2;
    wave_grp_num_of_subwaves[base_index * 5 + 4] = 1;
    wave_grp_num_of_subwaves[base_index * 5 + 5] = 2;

    // Wave 5: # of seconds delay between sub-waves.
    wave_grp_subwave_delay[base_index * 5 + 1] = 0;
    wave_grp_subwave_delay[base_index * 5 + 2] = 0;
    wave_grp_subwave_delay[base_index * 5 + 3] = 30;
    wave_grp_subwave_delay[base_index * 5 + 4] = 0;
    wave_grp_subwave_delay[base_index * 5 + 5] = 30;

    // Unlock items
    //
    // wave_unlock_item[# * # + #]
    //
    // The first # is the total number of waves.  Do not change this.
    // The second # is The wave #.
    // The third # is the index.
    wave_unlock_weapons[num_of_weapons * 5 + 1] = 5; // Chainsaw

    // ------------------------------------------------------------------------

    // Wave 6: # of monster groups.
    wave_num_of_grps[6] = 6;

    // Wave 6: monster groups.
    wave_grp[base_index * 6 + 1] = MONSTER_DEMON1_CLASSNAME;
    wave_grp[base_index * 6 + 2] = MONSTER_BARON1_CLASSNAME;
    wave_grp[base_index * 6 + 3] = MONSTER_BARON2_CLASSNAME;
    wave_grp[base_index * 6 + 4] = MONSTER_ELEMENTAL1_CLASSNAME;
    wave_grp[base_index * 6 + 5] = MONSTER_ELEMENTAL2_CLASSNAME;
    wave_grp[base_index * 6 + 6] = MONSTER_ELEMENTAL3_CLASSNAME;

    // Wave 6: # of monsters per group.
    wave_grp_amt[base_index * 6 + 1] = 2;
    wave_grp_amt[base_index * 6 + 2] = 1;
    wave_grp_amt[base_index * 6 + 3] = 2;
    wave_grp_amt[base_index * 6 + 4] = 15;
    wave_grp_amt[base_index * 6 + 5] = 4;
    wave_grp_amt[base_index * 6 + 6] = 6;

    // Wave 6: # of sub-waves per group.
    wave_grp_num_of_subwaves[base_index * 6 + 1] = 2;
    wave_grp_num_of_subwaves[base_index * 6 + 2] = 1;
    wave_grp_num_of_subwaves[base_index * 6 + 3] = 2;
    wave_grp_num_of_subwaves[base_index * 6 + 4] = 3;
    wave_grp_num_of_subwaves[base_index * 6 + 5] = 2;
    wave_grp_num_of_subwaves[base_index * 6 + 6] = 2;

    // Wave 6: # of seconds delay between sub-waves.
    wave_grp_subwave_delay[base_index * 6 + 1] = 15;
    wave_grp_subwave_delay[base_index * 6 + 2] = 0;
    wave_grp_subwave_delay[base_index * 6 + 3] = 30;
    wave_grp_subwave_delay[base_index * 6 + 4] = 30;
    wave_grp_subwave_delay[base_index * 6 + 5] = 60;
    wave_grp_subwave_delay[base_index * 6 + 6] = 30;

    // Unlock items
    //
    // wave_unlock_item[# * # + #]
    //
    // The first # is the total number of waves.  Do not change this.
    // The second # is The wave #.
    // The third # is the index.
    wave_unlock_weapons[num_of_weapons * 6 + 1] = 6; // Rocket Launcher
    wave_unlock_ammos[num_of_ammos * 6 + 1] = 3; // RocketBox

    // ------------------------------------------------------------------------

    // Wave 7: # of monster groups.
    wave_num_of_grps[7] = 3;

    // Wave 7: monster groups.
    wave_grp[base_index * 7 + 1] = MONSTER_ELEMENTAL1_CLASSNAME;
    wave_grp[base_index * 7 + 2] = MONSTER_ELEMENTAL2_CLASSNAME;
    wave_grp[base_index * 7 + 3] = MONSTER_ELEMENTAL3_CLASSNAME;

    // Wave 7: # of monsters per group.
    wave_grp_amt[base_index * 7 + 1] = 10;
    wave_grp_amt[base_index * 7 + 2] = 4;
    wave_grp_amt[base_index * 7 + 3] = 9;

    // Wave 7: # of sub-waves per group.
    wave_grp_num_of_subwaves[base_index * 7 + 1] = 2;
    wave_grp_num_of_subwaves[base_index * 7 + 2] = 2;
    wave_grp_num_of_subwaves[base_index * 7 + 3] = 3;

    // Wave 7: # of seconds delay between sub-waves.
    wave_grp_subwave_delay[base_index * 7 + 1] = 30;
    wave_grp_subwave_delay[base_index * 7 + 2] = 60;
    wave_grp_subwave_delay[base_index * 7 + 3] = 15;

    // Unlock items
    //
    // wave_unlock_item[# * # + #]
    //
    // The first # is the total number of waves.  Do not change this.
    // The second # is The wave #.
    // The third # is the index.
    // wave_unlock_weapons[num_of_weapons * 7 + 1] = 7; // Plasmagun

    // ------------------------------------------------------------------------

    // Wave 8: # of monster groups.
    wave_num_of_grps[8] = 1;

    // Wave 8: monster groups.
    wave_grp[base_index * 8 + 1] = MONSTER_FATSO1_CLASSNAME;

    // Wave 8: # of monsters per group.
    wave_grp_amt[base_index * 8 + 1] = 20;

    // Wave 8: # of sub-waves per group.
    wave_grp_num_of_subwaves[base_index * 8 + 1] = 2;

    // Wave 8: # of seconds delay between sub-waves.
    wave_grp_subwave_delay[base_index * 8 + 1] = 30;

    // Unlock items
    //
    // wave_unlock_item[# * # + #]
    //
    // The first # is the total number of waves.  Do not change this.
    // The second # is The wave #.
    // The third # is the index.
    wave_unlock_weapons[num_of_weapons * 8 + 1] = 7; // Plasmagun
    wave_unlock_ammos[num_of_ammos * 8 + 1] = 4; // CellPack

    // ------------------------------------------------------------------------

    // Wave 9: # of monster groups.
    wave_num_of_grps[9] = 1;

    // Wave 9: monster groups.
    wave_grp[base_index * 9 + 1] = MONSTER_ARCHVILE1_CLASSNAME;

    // Wave 9: # of monsters per group.
    wave_grp_amt[base_index * 9 + 1] = 3;

    // Wave 9: # of sub-waves per group.
    wave_grp_num_of_subwaves[base_index * 9 + 1] = 3;

    // Wave 9: # of seconds delay between sub-waves.
    wave_grp_subwave_delay[base_index * 9 + 1] = 20;

    // Unlock items
    //
    // wave_unlock_item[# * # + #]
    //
    // The first # is the total number of waves.  Do not change this.
    // The second # is The wave #.
    // The third # is the index.
    // wave_unlock_weapons[num_of_weapons * 9 + 1] = 8; // BFG9K

    // ------------------------------------------------------------------------

    // Wave 10: # of monster groups.
    wave_num_of_grps[10] = 2;

    // Wave 10: monster groups.
    wave_grp[base_index * 10 + 1] = MONSTER_SPIDER1_CLASSNAME;
    wave_grp[base_index * 10 + 2] = MONSTER_SPIDER2_CLASSNAME;

    // Wave 10: # of monsters per group.
    wave_grp_amt[base_index * 10 + 1] = 4;
    wave_grp_amt[base_index * 10 + 2] = 4;

    // Wave 10: # of sub-waves per group.
    wave_grp_num_of_subwaves[base_index * 10 + 1] = 2;
    wave_grp_num_of_subwaves[base_index * 10 + 2] = 2;

    // Wave 10: # of seconds delay between sub-waves.
    wave_grp_subwave_delay[base_index * 10 + 1] = 15;
    wave_grp_subwave_delay[base_index * 10 + 2] = 30;

    // Unlock items
    //
    // wave_unlock_item[# * # + #]
    //
    // The first # is the total number of waves.  Do not change this.
    // The second # is The wave #.
    // The third # is the index.
    wave_unlock_weapons[num_of_weapons * 10 + 1] = 8; // BFG9K

    // ------------------------------------------------------------------------

    // Wave 11: # of monster groups.
    wave_num_of_grps[11] = 1;

    // Wave 11: monster groups.
    wave_grp[base_index * 11 + 1] = MONSTER_CYBERDEMON1_CLASSNAME;

    // Wave 11: # of monsters per group.
    wave_grp_amt[base_index * 11 + 1] = 4;

    // Wave 11: # of sub-waves per group.
    wave_grp_num_of_subwaves[base_index * 11 + 1] = 4;

    // Wave 11: # of seconds delay between sub-waves.
    wave_grp_subwave_delay[base_index * 11 + 1] = 15; // 90

    break;

    ///////////////////////////////////////////////////////////////////
    // END
    ///////////////////////////////////////////////////////////////////
    }

}


Host command:

Code: Select all

C:\Doom\Zandronum\zandronum.exe  -host +exec "C:\Doom\_Wads\krhellway.cfg" -file "C:\Doom\_Wads\kwhr09c.pk3" "C:\Doom\_Wads\krhw09-maps.pk3" "C:\Doom\_Wads\krhw02-msx.pk3"
Host command (Brutal Doom):

Code: Select all

C:\Doom\Zandronum\zandronum.exe  -host +exec "C:\Doom\_Wads\krhellway.cfg" -file "C:\Doom\_Wads\kwhr09c.pk3" "C:\Doom\_Wads\krhwbd06-compat.pk3" "C:\Doom\_Wads\krhw09-maps.pk3" "C:\Doom\_Wads\krhw02-msx.pk3" "C:\Doom\_Wads\brutal19-official.pk3" "C:\Doom\_Wads\janitormodeforbdv1.pk3"
Host command (Complex Doom):

Code: Select all

C:\Doom\Zandronum\zandronum.exe  -host +exec "C:\Doom\_Wads\krhellway.cfg" -file "C:\Doom\_Wads\kwhr09c.pk3" "C:\Doom\_Wads\krhwcd02-compat.pk3" "C:\Doom\_Wads\krhw09-maps.pk3" "C:\Doom\_Wads\krhw02-msx.pk3" "C:\Doom\_Wads\complex-doom.v22b2.pk3" "C:\Doom\_Wads\krhwcd-janitor.pk3"
Mapping Tutorial:

Coming soon.

The easiest way to make your own map for Hellway Invasion, is to copy map32.wad in kwhw09-maps.pk3 and use/edit it for yourself.




Questions:
1. Can this mod run without the skulltag*.pk3 files?
Yes.

2. Can this mod run with add-on mods such as Brutal Doom, Complex Doom, etc.?
Yes.

3. Is everything in this mod configurable?
Yes.

4. Could this be used to replace the hard-coded invasion gametype?
Unfortunately, that isn't possible. The developer of Zandronum would have to do that.

4b. Also, would said invasion maps be able to be run with this instead?
Unfortunately, no. This engine works differently than the hard-coded invasion engine, and therefore the maps are designed differently.

5. Can each map have a different wave configuration and different # of waves?
Yes.

6. Can I turn off the "Need # player(s) to join." message?
No. This is an important feature, because it 1) reminds players (spectators) and/or provides a sense of incentive for them to join in, and 2) reminds players why they may be finding the game difficult to play.

7. Why the "Need # player(s) to join." message? How does it work?
One of the goals for this project was to emphasize on real co-op (team coordination). The message is there to ensure players know that. It also ensures that players understand that the maps are setup for 4-player gameplay, despite the server being set to allow 8 players. The message relies on the sv_maxplayers setting. The "#" is half of what sv_maxplayers is set to. E.g. An sv_maxplayers of 8 would have the message say "Need 4 player(s) to join". This is because this mod has a "forgiving" aspect to it. So, although you may be setting up your maps (and wave/monster configuration) for 4-player gameplay, you would allow 8 players to join.

8. Does the announcer say "Well done." every time?
No. The announcer only says "Well done." (after wave completes) when there are less # of players (required) playing. E.g. If 4 players are needed, but only 3 or playing, and those 3 players win the wave, then the announcer will say "Well done."

9. Why is there only 1 map?
MAP32 was the initial idea I had when creating this mod. I have little time to do 31 more maps. I built the invasion engine, now it's up to the people to build the maps. Fair enough?

10. What's this project based off of?
An awesome co-op survival invasion game called Killing Floor.

11. Do you know DECORATE?
No.

12. Without looking at the mapping tutorial, can you tell me if the base can have multiple doors?
Yes. Currently, you can have a maximum of 10 doors. There is a range of TIDs available for doors, ranging from 500 to 509.

13. Again, without looking at the mapping tutorial, can you tell me if I can have multiple bases (spread across/around a large map)?
Yes. But, there will always be a "main base", so to speak; for things like your player spawns, and surrounding teleport spawns and such. In fact, currently it wouldn't work out very well, because teleport spawns are for one base only and players would always be teleported to those spawns where they might have expected to be teleported to new teleport spawns that surround the particular base they were at. Also note, you'll run out of available TIDs quickly, because each piece (that uses a TID) will require it's own unique TID within the range of TIDs available.

14. For mapping, can I have doors (walls) unlock for each wave?
Yes. Currently, there is a system in place that you can give a wall (floor raised to ceiling) a TID, which will add behaviour for that wall to lower when a wave is completed. There is a range of TIDs available for this, ranging from 551 to 599. E.g. 551 would activate when Wave 1 is completed. 552 for Wave 2, and so on...

15. With regard to my previous question, can you provide some examples for this type of feature/functionality?
Well, in previous versions of MAP32, this feature was used to 1) unlock weapons, in the base. Each weapon was surrounded with a gate (wall). But, no longer doing that. I would say that a really great way to use this feature, would be to 2) expand the map. Having sections open up, providing players more room, when they get to the higher # wave(s).
Last edited by arkore on Sat Jan 11, 2020 5:40 am, edited 5 times in total.

User avatar
Monsterovich
Forum Regular
Posts: 343
Joined: Sun Jun 17, 2012 5:46 pm

RE: Hellway Invasion (a new invasion engine)

#2

Post by Monsterovich » Tue Oct 07, 2014 11:56 am

At first look, it's a typical invasion. Nuff said..
I'll check it out.
Last edited by Monsterovich on Tue Oct 07, 2014 12:01 pm, edited 1 time in total.

User avatar
Dark-Assassin
Maintenence Crew
Posts: 968
Joined: Fri May 25, 2012 4:25 am

RE: Hellway Invasion (a new invasion engine)

#3

Post by Dark-Assassin » Tue Oct 07, 2014 12:05 pm

Any chance this could be used to replace the hard coded invasion gametype? And also, would said invasion maps be able to be run with this instead?

User avatar
fr blood
Frequent Poster Miles card holder
Posts: 992
Joined: Wed Mar 06, 2013 4:04 pm
Location: France

RE: Hellway Invasion (a new invasion engine)

#4

Post by fr blood » Tue Oct 07, 2014 4:08 pm

It's nice to see someone trying to keep Invasion mod alive, good luck with this project.

Post Reply