Javascript prototypical inheritance made easy

Inheritance, multiple inheritance and mixins in 4 steps:
  1. Define function A filled with this.myProperties
  2. Define a function B you want to receive the properties
  3. FunctionA.call(FunctionB.prototype)
  4. myFunctionB = new FunctionB()
myFunctionB will have the properties defined in FunctionA.

This is easy to do, so you can design you own ways of sharing properties among functions. 


function UtilityBelt(){
   this.batBuckle=true // "this" is Batman during the "call"
   this.batarang=true
}
var Batman=function(){
}
var p=Batman.prototype //nothing to see here yet

var bruce=new Batman()

UtilityBelt.call(Batman.prototype) //inheritance!
Batman.prototype.holster=null
console.log(bruce.holster)//null
console.log (bruce.batBuckle)//true
bruce.batBuckle=false
console.log (bruce.batBuckle)//false
bruce.AGE=55
console.log (bruce.AGE)//55

var kate=new Batman()

Batman.prototype.holster=true
kate.AGE=44
console.log(kate.holster)//true
console.log(bruce.holster)//true (everybody has the same protoype utility belt)
console.log (bruce.AGE)//55 (everybody their own age)
console.log (kate.AGE)//44
If you add a property to the prototype ("Batman"), all the children get the same property.
If you add a property to an instance ("bruce"), each instance has its own property.

JavaScript: Curried Conversion Functions

We can create a JavaScript function that will convert Fahrenheit to Centigrade:
alert(f2c(59)) //15
If we add a "false" parameter, it converts in the opposite direction: 
alert(f2c(15,false))//59
The f2c() function is curried from a converter function, so you can create as many conversion functions as you like. The offset
parameter is -32 for Fahrenheit to Centigrade, for most conversions offset will be 0.

The curry function is from Curry: cooking up tastier functions

Function.prototype.curry = function () {
   if (arguments.length < 1)
      return this //nothing to curry with - return function
   var __method = this
   var args = toArray(arguments)
   return function () {
      return __method.apply(this, args.concat(toArray(arguments)))
   }
}
var converter = function (ratio,  offset, input,mul) {
   if (mul===false)
      return (input / ratio) - offset
   else
      return (input + offset) * ratio
}

var kilo2pound = converter.curry(2.2, 0)
var mile3kilometer = converter.curry(1.62, 0)
var f2c = converter.curry(0.555556, -32)
var yard2meter = converter.curry(1 / 1.0936132983377077865267, 0)
var inch2mm = converter.curry(25.399999999972568, 0)

alert(inch2mm(12.5,false))//0.492
alert(inch2mm(12,true)) //304.8
alert(inch2mm(12)); //304.8
alert(f2c(59)) //15
alert(f2c(15,false))//59

Roxy Music - Pyjamarama, Opening Tab

I bought the single in 1973, tempus fugit alors, as th' Lone Groover might say.
e---------------------------------------|
B---------------------------------------|
G--0-0-3--0-0-0--0-0-0--0-0-0-----------|
D#-0-0-0--0-0-0--0-0-0--0-0-0-----------|
A--6-6-6--5-5-5--4-4-4--3-3-3-----------|
E#--------------------------------------|
The 3rd fret G is on some of the arpeggio work, not the power chords.
Sounds like the D string is tuned to D#, E to E#, and Phil plays a descending line with one finger on the A string, with the D# and G strings as an open drone. The tuning won't interfere with the solo.






The Javascript Pyramid Model, gather classes into a Pyramid and seal it up forever

The builders of the pyramids were killed and buried within the pyramid as an early form of architectural design  encapsulation.
So shall it be with Javascript.

Problem: your program has 30 classes in an unstructured mess.
Solution: gather related classes into sealed "Pyramids", forcing strict structure upon your unruly code.

Here I present the Pyramid model, each Javascript Class is surrounded by stone, and the occupants are forced to communicate by radio. Stone is an anonymous closure, radio is a pubsub. When a constructor is called, its last act is to delete its own scope.
  1. Organises your classes into privately scoped groups "Pyramids"
  2. Nothing outside a Pyramid may access anything inside the Pyramid, the Pyramids are loosely coupled.
  3. Each Pyramid publishes selected methods so that other Pyramids may subscribe to them.
  4. One line of code per class, and one line per Pyramid.

Here we have an "Pyramid Object" that represents the constructors for a group of classes.
 models = {Model: null, Scenario: null, Turret: null, Targets: null, GunRange: null}, 
Each null is replaced with the real class constructor when it is declared.

controllers = {Clicks: null, Controller: null, Events: null},  
Our "controllers" Pyramid Object is composed of the class constructors for Clicks, Controller and Events.

This organises our classes into 2 "Pyramid Object" packages, "models" and "controllers". It not only documents the design, it will encapsulate them in stone. Nothing in "models" may reference anything in "controllers", and vice versa.

 (function () {//Anonymous Closure  
 models.Model = jsface.Class(function () {  //add constructor to Pyramid Object

 var t  
   return (BallModel, {  
    constructor: function (controller) {  
      t = this  
      t.scenario = new models.Scenario(t, controller)//use the "model" constructor  
      t.targets = new models.Targets(t, controller)  
      t.elevation = new models.Turret('elevationTurret', 20)  
      t.gunRange = new models.GunRange(t, controller)  
      radio("elevationSpriteEvent").subscribe([t.elevation.setSprite, t.elevation]) //pubsub  
      delete models.Model  
    }  
   });  
 })()  
 }()); //END CLOSURE  
Our Model class instantiates itself and the other member of the Pyramid Object. The last act of the constructor is to delete itself from the "models" object. Since there is an anonymous closure around Model is is now cemented shut. Nothing can reference it at all.


 (function () {//Anonymous Closure  
 models.Scenario = jsface.Class(Sbox, function () {  //add constructor to Pyramid Object
   function isLastScenario(scenarioNum) {  
    if (firstTime)  
      return false  
    else  
      return scenarioNum === t.arr.length  
   }  
   return {//t.theRange, t.targets.arr,  
    constructor: function (modelP, controllerP) {  
      t = this  
      model = modelP  
      controller = controllerP  
      radio("nextTargetEvent").subscribe([nextTarget, this])  
      radio("startScenarioEvent").subscribe([startScenario, this])  
      delete models.Scenario //remove the "model" constructor,   
    }  
 });  
 }()); //END CLOSURE  
All the classes in the "models" object delete themselves from the object.
Now the Pyramid object is empty:

 models = {}  
So nothing can reference anything outside its own class. Which isn't much good, so we use a Publish–subscribe pattern "radio.js" so the occupants of the pyramids can call each other.
The classes here use the jsface.js library, it doesn't matter how you implement classes here.

As shown, you can only have one instance of each class. If you want several instances of one class, leave out the "delete" in the classes constructor and clear the Pyramid object later on:


deleteProperties: function (obj) {
   for (var x in obj)
      if (obj.hasOwnProperty(x))
         delete obj[x];
}
t.deleteProperties(models)
t.deleteProperties(controllers)

Space Crusade Lite, a 1 hour Skirmish

Overview:
A 1 hour skirmish game using Space Crusade components. Any miniatures and 12x12 squared boards could be used. You will need a Space Crusade rulebook and cards, the cards could be handwritten copies of Space Crusade cards on index cards, you would need about 6 per player.
The self-destruct aboard the ship has been activated, you have 12 turns to kill the traitorous Space Marines and teleport to safety
Setup:
Take 1 board per player and push them together. there will be a 2-square corridor between boards, but add an extra door to each board junction. Place a coin on each board in 1 corner, the coins should be as far apart as possible. Place a Space marine or Chaos 5-man squad as close to each coin as possible on separate squares. The coin is a teleporter for the adjacent marine squad, no other squad can use it. Any Marine entering the teleporter square is removed from play for the rest of the games, but is a survivor.
Objective:
The games requires 12 turns. You get 1 point for every enemy you kill, and 1 point for every marine who teleports off the ship. You lose a point for each of your Marines on the board on turn 12 (the ship explodes). The player with the most points at the end of turn 12 wins.
Play:
The marine squads fight each other as per the rulebook, except that the commander has 2 life points instead of six. You can have either 1 or 2 heavy weapons. Chaos has only one heavy weapon marine miniature.
Cards:
Each player randomly selects 1 of their Equipment cards and 2 of their Order cards. A Chaos player will select from any 1 player's unused cards. The cards are hidden from the other players until used. So you reveal a Targeter card the first time you fire the weapon in question. As usual, equipment cards last the whole game, Order cards for 1 turn.
Strategy:
You need to kill as many of the other player's troops as you can (they are in the thrall of Chaos), and teleport off the ship before turn 12 ends. The heavy weapons are more effective, but they spend most of their time advancing and then running to the teleporter.
The cards will determine the player's strategy, a "fire twice" card used wisely could win the game.
So you advance, position your troops and play your order card. Two turns later you will have lost or won the engagement, and a well planned retreat will be needed.
Campaign:
The winner gets an extra equipment card in the next game, cumulative between games. The player who wins the 4th game wins the campaign.
Aliens:
Create an 8 Orc squad, each player bids the number of Gretchins they want, lowest bid takes the greenskin side, no cards. Gray team 1 Dreadnought, bid for number of Androids. There are alternate Marine Squads such as Pauli_SC_new_squads_v1.zip in the BGG file area. Pauli_SC_new_squads_v1 creates new chapters and cards out of a single text file, this would work well with the Space Crusade Lite system, you can easily have Angry Marines, Mr. Bean marines or whatever.







The street I used to live in

Clifton Park Avenue, Belfast, UK.
The more cheery public facade



I ain't gonna work on Maggie's farm no more...
His bedroom window
It is made out of bricks
I lived about 2 doors to the right, 178, but I had windows, which was nice. Across the street from me in 185, another Intelligence Corps guy:
"Out of concern for staff and for residents living in neighbouring houses, the community group and the Ulster History Circle have decided that it was best to remove the plaque for the foreseeable future, and it was removed at the end of last week."
"Given the attack on the synagogue last month and now this, it shows that some people's hearts and minds remain full of hatred."


SciFi Dungeon

It would be interesting to have an electric shield and Taser sword in modern tactical games, like a knight in a fantasy game.

The trouble with Tribbles

I pulled out my ear defenders, but I still couldn't hear in one ear. The eardrops and the little water squirter worked really well. My ear canal was solid with wax compacted by the earplugs. So I hereby recommend and endorse Murine.

The other ear:


Level 7: Omega Protocol as a Space Crusade Expansion


"Level 7: Omega Protocol" has 1" squares, so the rooms and corridors can be used for expanding Space Crusade. There are manhole covers, blast templates and a variety of tokens, as well as dice and miniatures. You could also play Omega Protocol with  Space Crusade rules, if you don't have Space Crusade.

Space Crusade - Squad Stances



Stance cards give the players tactical options, producing more thoughtful gameplay.
The card is placed face down beside a Space Marine squad at the end of the player turn, and is turned over at the start of the next player turn. So you have to decide your stance one turn in advance.
  • Caution: Move is limited to 3 spaces, the first miniature to be attacked gets to reroll 1 enemy attack die.
  • Reckless: Move is increased by 3 spaces, the first 2 miniatures to be attacked each suffer an attacker reroll.
  • Command: Move is limited to 3 spaces, 1 miniature gets an attack reroll and one miniature gets a defend reroll if they are within 1 space (diagonal OK) of their Commander. The Commander may use the reroll, 1 miniature may take boths rerolls.
  • Phalanx: None may move, the first 2 miniatures to be attacked each get to reroll 1 enemy attack die. 
Rerolls can be for shooting or Hand to Hand Combat. The player who rerolls may elect not to reroll.
The Alien player gets a Stance Card for each color group of his miniatures.
Only 1 Marine Stance Card and 1 Alien Stance Card may be in play at any one time, the Marine players must take turns.

The big tactical strategy in Space Crusade is to have 5 guys attacking 2 guys. "Phalanx" gives the 2 guys a chance. And now you have Reckless Dreadnoughts lurching across the battlefield, and the Chaos Commander actually commanding his marines.

I got the idea from Level 7 Omega Protocol, which should arrive in the mail next Monday. It does seem to be a 21st Century Space Crusade.

For H2H (modified by from a question by Paul Dale)

Space Crusade - Action Tokens

Capture key points! Overwatch! Race-specific abilities! Hardly any new rules!

You get 1 action Token per turn, plus one for holding the room with the fancy graphic that each board has.
You get an extra Token for each of these rooms you hold
You hold a room if your team occupy the room (blips don't count) and no other units are present at the end of the Game turn. The Alien player gets 1 Action Token for every Marine player each turn, and 1 for each room held.
A player may not hide her tokens, this is not a memory test. A miniature may not benefit from 2 Actions in one turn. You spend Action Tokens during you move only, even if they are to be used in the enemy's turn. Sometimes they may be wasted.

Action Tokens can be spent on the following Actions:

Cost Name Effect
1 Lookout 1 designated miniature gets to move their full move an the end of an enemy's miniature's turn if they saw the enemy move
2 Shoot n' Scoot Move 1 square, fire, move back to the original square during this turn.
4 Ambush Move 1 square, fire, move back to the original square,in the
enemy turn, after any enemy miniature completes its turn
2 Overwatch 1 designated miniature gets to fire an the end of an enemy miniature's turn if it is now in LOS
1 Revenge If one of your squad loses or draws in hand-to-hand, another of
your squad within 4 squares may take a free move and a free hand-to-hand attack on the enemy concerned.
2 Mark of Terror Enemy must roll a 1 or 2 to move a unit into your LOS
2 Leadership Any 2 Miniatures Adjacent to any friendly Commander may
re-roll one die of their choice when attacking.
2 Berserk 1 miniature gets +2 move, and 1 extra red die on  Hand-to-Hand attack
3 Swarm 2 miniatures may combine Hand-to-Hand rolls on the same target
1 Cover One reroll on any shooting attack against you.
2 Cover Fire If an enemy moves adjacent to one of your squad, another
squad member with LOS gets a free shot at him before Hand-To-Hand can occur

Optional Race rules:

Cost Race Name Effect
4 Dark Eldar Steal Soul Double points on your first kill this turn
2 Dark Eldar Combat Drugs 1 miniature gets +2 move, and 1 extra white die on any attack
2 Space Marine Apothecary If one of your squad loses a Life this turn, a white die 1 or a 2 restores him
2 Sisters Martyrdom 6 Action Tokens for every miniature you lose this turn
2 Sisters Prayer Commander misses a turn, rest of squad get a reroll each in
all their attack rolls
2 Gretchen  Run Away All of the Squad except Heavy Weapons may move 2 squares
away from a visible enemy at the end of their turn
2 Ork/Khorne Berserk 1 miniature gets +2 move, and 1 extra red die on  Hand-to-Hand attack
3 Tyranid Swarm Any number of miniatures may combine Hand-to-Hand rolls on the same target
4 Eldar Psychic Storm Attack any square on the board with a Missile Launcher attack. Any blips in the 3x3 square are revealed.
4 Eldar Farseer When you see the next Alien Event Card, you may chose to
double it's effect, or to ignore it.
3 Android/Dread EMP Pulse No Enemy Heavy Weapons may fire at you this turn
3 Tau Marker Light Place a marker on 1 enemy unit. At the start of your next turn,
they are attacked by 3 red dice
4 Ork WAAAAAGH! All Orks may move an extra 2 spaces this turn


Comment: This changes Space Crusade's "I-Go-You-Go" gameplay. The management of Action Tokens also adds skill to the game. A Dreadnought or Commander with Shoot n' Scoot can kill your most expensive unit before it has a chance to attack. But Mark of Terror can prevent this. A unit left exposed can defend itself if you have the Action Points. Eldar get to be Psychic, Tyranids get to swarm, Khorne go berserk and so on. With just one table and some tokens.




I'm thinking about simple bonuses,  2 tokens each:


  • Force Shield: One miniature gets +1 armor for the turn.
  • Combi-Plasma: One miniature gets a Plasma Rifle for the turn.
  • Combi-Flamer: One miniature gets a Flamer (4 squares 2 red dice per square. anyone entering the squares is attacked by 2 dice) for the turn.
  • Full Auto: One miniature may fire twice this turn.
  • Double or Nothing: When you see the next Alien Event Card, you may chose to double it's effect, or to ignore it.
Or draw an extra order card, 4 tokens.

Space Crusade - Quickie Mode

Space Crusade in Quickie mode is just one board with 2 opposing teams. There are no Equipment, Order or Event cards by default. Commanders have 3 life points.
They won't hear us coming until it's too late...
Solo Space crusade rules, a 1 in 6 of the enemy room opening its doors each turn. The door opens at a bad time. Kharn the Khone commander uses his Special weapon on Extra Danger mode killing a Space Wolf Missile launcher and a Plasma Rifle with one shot. The Chaos Conversion beam doesn't get to kill anybody, and is killed by the rocket launcher. One of the Berserkers takes 2 life points off the Space Wolf  Commander, but the Iron Priest Techmarine kills all the Berserkers. Kharn kills the Space Wolf  Commander and Iron Priest with Danger mode on the plasma pistol, with no harm to himself. Skulls for the Skull throne!
No overwatch rules, the Wolves get caught coming around the corner.
5 minutes to set up, 5-10 minutes play and a fair bit of fun. You can use a homemade board and whatever minis you have if you don't own Space Crusade.

Using magnets for dungeon tiles

On EBay, "100pcs 5mm x 1mm Disc Rare Earth Neodymium Super Strong Magnets N35 Craft Model" US $2.99. Superglue them into your foamboard terrain pieces to keep them together.
Space Hulk boards have nifty jigsaw cutouts, I decided not to bother when I made my own, but they do slip and slide more than one would like. Magnets easily solve the problem:


Since the magnets cost 0.3 cents each, you could probably afford to use twice as many to enhance the structural integrity of your Hulk. 

You could cut slots in the board to leave the magnets flush, which would not increase layout sizes, and would be more secure.

1x2mm magnets also work. Level 7: Omega Protocol had boards which fit together in different ways, so you need multiple magnets at 1" intervals. Superglue isn't good with paper, contact cement might be better:



Space Crusade - Improvements Overview

This is a big improvement Baldrick...

My 4 super suggestions for Space Crusade. Solo/Co-op play, Tech Research Labs, Actions tokens for fire and movement during the enemy turn, and the ability to use corners as cover.

Solo/Co-op  Space Crusade
EXplore, EXpand, EXploit and EXterminate
Action Tokens
Use of Cover

Random house rule, if the commander has a gun, if a member of his squad is killed by an enemy in his line of sight, he can fire a free shot immediately at that enemy. The improves the heavy bolter option, and helps out a player who is taking losses. Or, if a marine has a bolter, if a member of his squad is killed by an enemy in his line of sight in hand-to-hand, he can fire a free shot immediately at that enemy.

Space Crusade - Use of Cover



Here only A and B are in cover because: 1: The Red Circle Guy can't see the whole square. 2: A and B can move 1 non-diagonal square to be 100% out of sight.  So the A or B gets a saving roll, allowing them to duck around the corner.

Cover on Corners: If you get shot and you lose a life point, but you are "In Cover" (see above), roll a white die. If the result is 1 or 2, 1 lifepoint is instantly restored. (Corners provides protection. So skillful tactical planning is rewarded. You could outflank your opponent so he has no place to hide.)

Comment, this reduces the "A-Team" nature of Space Crusade, where everybody just lines up and shoots each other. Now you can win the firefight by careful placement of your troops.

Edit: "Hour of Glory" - Killing Time 3 (2008) has a similar cover rule, except that cover doubles the firing range. Hour of Glory isn't entirely unlike Space Crusade, especially the BunkerStorm expansion.
Great minds think alike.

Javascript Dice probability calculation with rerolls and custom dice

If you don't want to calculate dice roll probabilities you won't want to read this.
Anydice.com is good for simple things, but I don't understand how to calculate probabilities for "If the lowest die is a 3 then roll an extra die unless.." rules that you sometime have in board games.

Here is a Javascript program that rolls dice with any number of sides, any number on each face of the dice, and any kind of rules you want to implement. Here I use a "If either die is Zero, re-roll one die that is zero" function, it isn't difficult to  program different rules.

The program just makes lots of dice rolls and takes an average.

red = [1, 2, 3, 0, 0, 0], //Red Space Crusade die
white = [1, 2, 0, 0, 0, 0], //White Space Crusade die
                
Here is a simple Javascript program that rolls:
 2 white Space Crusade dice (see above picture), rerolling one zero value.
 2 red Space Crusade dice, rerolling one zero value.
 2 D6 dice, simple total.


For example, this function rolls 2 dice and returns the total. The dice can have any number of sides, and any number on each side. You can use if/then/else statements to handle things like doubles or snake eyes.

        function rollTwo(colorDie) {//simple total
            var die1, die2;
            die1 = rollDie(colorDie);
            die2 = rollDie(colorDie);
            return die1 + die2;
         }
The "trials" function takes the dice, number of rolls, and the function to apply:
         function trials(diceArray, times, funct) {
            var i, roll, result = [];
            for (i = 0; i < times; i++) {
               roll = funct(diceArray);
               while (result.length < roll + 1) {
                  result.push(0);
               }
               result[roll] = result[roll] + 1;
            }
            return result;
         }
The "displayResult" function just creates a display string from the contents of the "result" array.
There is a paragraph in the .html to display the result string.
That's about it.

Sample output:
The rolls were
0: 29.34 %
1: 22.1 %
2: 29.05 %
3: 12.61 %
4: 6.9 %
The rolls were
0: 12.72 %
1: 13.07 %
2: 17.71 %
3: 23.4 %
4: 16.35 %
5: 11.31 %
6: 5.44 %
The rolls were
0: 0 %
1: 0 %
2: 2.75 %
3: 5.64 %
4: 8.24 %
5: 11.06 %
6: 13.89 %
7: 16.21 %
8: 13.78 %
9: 11.36 %
10: 8.79 %
11: 5.51 %
12: 2.77 %

The chart gives the same numbers as the text output above it, 7 is 16.21 % (16.67 % is the correct answer) for example.
The program rolls the dice 10,000 times, so you never get exactly the same numbers. 
If you copy and paste the text below into a text editor and save it as "whatever.html", you can click on the file and it runs in the browser. Or run the program from here.

<===================== below this line is the program ========================>

<!DOCTYPE html>
<html>
   <body>

      <p id="white"></p>
      <p id="red"></p>
      <p id="d6"></p>       

      <script>
         var white = [0, 0, 0, 0, 1, 2], //White Space Crusade die
                 red = [0, 0, 0, 3, 1, 2], //Red Space Crusade die
                 d6 = [1, 2, 3, 4, 5, 6], //Normal D6 
                 d10 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ], //Normal D10
                 result;
         document.getElementById("red").innerHTML =
                 "Calculating";
         document.getElementById("white").innerHTML =
                 "Calculating";
         document.getElementById("d6").innerHTML =
                 "Calculating";
         result = trials(white, 10000, rerollOne);
         document.getElementById("white").innerHTML =
                 "The rolls were <br>" + displayResult(result, 100) + " ";
         result = trials(red, 10000, rerollOne);
         document.getElementById("red").innerHTML =
                 "The rolls were <br>" + displayResult(result, 100) + " ";
         result = trials(d6, 10000, rollTwo);
         document.getElementById("d6").innerHTML =
                 "The rolls were <br>" + displayResult(result, 100) + " ";

         function displayResult(anArray, divide) {//result array, divisor for output to make it look like a percentage
            var i, limit, str = "";
            limit = anArray.length;
            for (i = 0; i < limit; i++) {
               str += i;
               str += ": ";
               str += anArray[i] / divide;
               str += " %<br>";
            }
            return str;
         }


         function trials(diceArray, times, funct) {//die array, number of iterations, function to use
            var i, roll, result = [];
            for (i = 0; i < times; i++) {
               roll = funct(diceArray);
               while (result.length < roll + 1) {//make result array bigger if needs be
                  result.push(0);
               }
               result[roll] = result[roll] + 1;
            }
            return result;
         }

         function rollDie(colorDie) {//returns a random die roll result
            return colorDie[randIndex(colorDie.length)]
         }
         function randIndex(num) {
            return Math.floor((Math.random() * num));
         }
         function rollTwo(colorDie) {//simple total
            var die1, die2;
            die1 = rollDie(colorDie);
            die2 = rollDie(colorDie);
            return die1 + die2;
         }
         function rerollOne(colorDie) {// if one result is zero, reroll it
            var die1, die2, reroll;
            die1 = rollDie(colorDie);
            die2 = rollDie(colorDie);
            reroll = rollDie(colorDie);
            if (die1 === 0) {
               die1 = reroll; //reroll first die if zero
            } else {
               if (die2 === 0) {
                  die2 = reroll; //otherwise reroll second die if zero
               }
            }
            return die1 + die2; //total of 2 dice
         }
      </script>

   </body>
</html>

Space Crusade - "EXplore, EXpand, EXploit and EXterminate"

A lot of people complain that Space Crusade isn't enough like Civilization, or even Starcraft. That you don't get to "EXplore, EXpand, EXploit and EXterminate", just EXterminate! EXterminate! EXterminate! EXterminate!

TLDR: 12 cards to give you tech research centers to find and capture in Space Crusade.

Why don't the Marines just nuke the ship? Because it is full of lost technology the Imperium desperately needs. We must find this tech, research it and use it to expand.

So let's explore the ship, find resources, research tech, and so on:
Each Board has a Research Center with special graphics "A", "B", "C" and "D".

Preparation:
Make 12 Tech cards (see below), just write the text on an index card. You don't have to use them all, you can make up new ones. C'mon, 10 minutes work for a new game.

Rules:
The first time a miniature (not a blip) appears in a Research Center, place a random Tech Card in the room and reveal it. That room controls that one technology for the rest of the game.

A Player captures a Research Center as soon as they have a miniature in the room, with no other player's miniatures in the room. They hold the room (even if it is empty) as long as no-one else captures it. You can place an unused weapon or order card in the room to mark it as yours. If you hold the Center at the start of 3 consecutive turns (Rotate the card 90° at the start of each turn) you have researched a Technology. You may use that Technology only as long as you control the Center, although "Permanent" modifications (Psycho-Surgery, Genestealer) persist if the Center is lost.

12 Tech Cards:
  • Apothecary: Every time one of your miniatures dies (Not Androids), roll a white die. If the result is 1 or 2, the miniature's life is saved. The miniature cannot move or attack in its next turn, but if it wins in defending Hand to Hand, that counts as a draw.
  • Hydrogen Weapon Prototype: Your Marines, Chaos Marines and Commanders get the option of shooting any target with 2 red die instead of their normal attack. If the target takes no damage, the shooter suffers a Missile Launcher attack on his own square (39% chance of killing a Marine, 20% chance of killing yourself. Better than Hand to Hand, great against Orcs). 
  • Forceshield: Pick only one non-Commander Marine. After he spends a turn in the Forceshield Center, he gets armor of 3, and 2 red dice in hand-to-hand. The Forceshield bonus is lost if the Center is lost. If he is killed, a new Marine can visit the Center for a turn to get a new Forceshield.
  • Smoke Grenades: Instead of a normal attack, any non-Commander Marine or Chaos Marine can place a marker on a square in his line of sight. That square, and the 8 squares around it become Smoke squares until the start of your next turn, when the marker is removed. Nothing entirely in the center Smoke square can shoot or be attacked by Miniatures or Alien Event cards. All 9 Smoke squares block LOS and Plasma fire.
  • Meth Lab: All your miniatures get to move 2 squares further each turn, to a limit of 8 squares.
  • Ship Systems : At the start of your turn you may open or close any 2 of the individual doors.
  • Sacred Artifact: If you have a Marine Commander or Chaos Commander, that Commander gets an attack method with psychic energy. They can attack any miniature within 6 squares (diagonally OK) with 1 red dice and 1 white dice combined, Line of Sight is not required.
  • Psycho-Surgery: Any 1 miniature (not Androids) in this Center at the start of your turn can be Permanently converted to a Berserker. The surgery takes 1 complete turn, the patient may neither move nor fire. The Berserker rolls an extra red die in Hand-to-Hand, but must always move towards the nearest enemy by the most direct route at the start of its owners turn. If the Center is recaptured, the miniature keeps its Berserk status.
  • Transporter: Roll a red die to lock on to any miniature (Friend or Foe) on the board at the end of your turn. If the result is 1-3, beam the miniature to any unoccupied square on the same board at the start of your turn.
  • Sentry Gun Center: At the start of your turn, attack one miniature on any corridor square on the same board as the Center with a total of 1 red die and 1 white die.
  • Power Armor Upgrade: All your Marines or Chaos Marines your Marines get improve armor control software, they can fight multiple opponents. If they win in Hand-to-Hand, all enemies adjacent to the Marine die. Heavy weapons have a move of 5.
  • Self Destruct Center: Announce 1 target board (from the 4), and "Self Destruct Sequence Initiated 4" at the start of your turn. At the start of your next turn announce "Self Destruct Sequence Initiated 3", and so on.  When you announce "Self Destruct Sequence Initiated 0", every miniature on the target board is immediately killed. Once started, the sequence is aborted only when the Self Destruct Center changes hands. (Everyone on the target board will have to leave by 1 of 2 exits, where ambushes may await. The Center on the abandoned sector is open to capture.)
So there you have it, the Player who holds key terrain will tech up and dominate the game.

The Alien starts a Self Destruct sequence on the last board it occupies. "To the last, I grapple with thee; From Hell's heart, I stab at thee; For hate's sake, I spit my last breath at thee". Will the Marines try for a transporter lock on the Dreadnought in the Self Destruct Controller Room, or will the Marines flee for the Docking Claw? You decide!

Make up some cards of your own. Plague, Nothing, Skull Probe, whatever.