Incite & Infiltrate
Overview
Aliens scheme to colonize Earth. Players dispatch spies to seize control of politics, culture, science, and religion — while mounting exposure raises the risk of detection.
A deck-building strategy game soaked in satirical dark humor — a study in how bureaucracies process the impossible.
Contributions
- Procedural alien cards — attribute pool plus modular face art for a population that never quite repeats.
- Effect card design — handcrafted rarity ladder tied directly to the attributes it mutates.
- Dynamic news system — ticker and breaking-news pop-ups driven by live game values.
Procedural Alien Cards
Procedural generation — attribute pool
Modular faces, rolled stats
Each alien card samples attributes from a shared pool across culture, religion, politics, technology, and lifespan. Card art is split into face contour, upper face (eyes), and lower face (mouth) — combined randomly for a population that never quite repeats.
Effect Card Design
Effect cards — rarity ladder
Rarity locked to fiction
Handcrafted cards modify alien attributes. Rarity distribution leans common — 70% Level 1, 20% Level 2, 10% Level 3. Each card's narrative ties directly to the attribute it mutates, so the fiction and the math stay locked together.
Data-driven authoring
ScriptableObject · card schema
ScriptableObject schema
Cards and aliens are ScriptableObjects, so new content can be dropped in as data rather than code. Designers edit attributes, rarities, and copy directly in the Unity inspector — no recompiles, no engineering round-trip.
| 1 | using System.Collections; |
| 2 | using System.Collections.Generic; |
| 3 | using UnityEngine; |
| 4 | using UnityEngine.UI; |
| 5 | |
| 6 | public class AlienCardProcGen : MonoBehaviour |
| 7 | { |
| 8 | // assign fields |
| 9 | public Text lifeSpan; |
| 10 | public RectTransform culIcon, relIcon, polIcon, techIcon; |
| 11 | public Image head, eyes, mouth; |
| 12 | public Sprite[] headSpr, eyesSpr, mouthSpr; |
| 13 | public int cul, rel, pol, tech, lifeSpanNumber; |
| 14 | public int genSpeed, discoverRate, propertyMax; |
| 15 | public int lifeMin, lifeMax, totalAbility; |
| 16 | public List<float> properties; |
| 17 | |
| 18 | void Start() |
| 19 | { |
| 20 | // initialize list |
| 21 | for (int i = 0; i < 5; i++) { properties.Add(0); } |
| 22 | genSpeed = 3; |
| 23 | discoverRate = 2; |
| 24 | |
| 25 | // head Generate |
| 26 | head.sprite = headSpr[Random.Range(0, headSpr.Length)]; |
| 27 | eyes.sprite = eyesSpr[Random.Range(0, eyesSpr.Length)]; |
| 28 | mouth.sprite = mouthSpr[Random.Range(0, mouthSpr.Length)]; |
| 29 | |
| 30 | SetValues(); |
| 31 | lifeSpan.text = "Health " + lifeSpanNumber; |
| 32 | } |
| 33 | |
| 34 | private void SetValues() |
| 35 | { |
| 36 | // roll numbers |
| 37 | for (int i = 0; i < properties.Count; i++) |
| 38 | { |
| 39 | properties[i] = Random.Range(0, totalAbility); |
| 40 | totalAbility -= (int)properties[i]; |
| 41 | } |
| 42 | // shuffle numbers |
| 43 | for (int i = 0; i < properties.Count; i++) |
| 44 | { |
| 45 | float temp = properties[i]; |
| 46 | int randomIndex = Random.Range(i, properties.Count); |
| 47 | properties[i] = properties[randomIndex]; |
| 48 | properties[randomIndex] = temp; |
| 49 | } |
| 50 | // set numbers |
| 51 | cul = (int)(properties[0] / 100 * propertyMax); |
| 52 | rel = (int)(properties[1] / 100 * propertyMax); |
| 53 | pol = (int)(properties[2] / 100 * propertyMax); |
| 54 | tech = (int)(properties[3] / 100 * propertyMax); |
| 55 | lifeSpanNumber = lifeMin + (int)(properties[4] / 100 * lifeMax); |
| 56 | // set bar |
| 57 | culIcon.sizeDelta = new Vector2((100 - 8) * properties[0] / 100, 19); |
| 58 | relIcon.sizeDelta = new Vector2((100 - 8) * properties[1] / 100, 19); |
| 59 | polIcon.sizeDelta = new Vector2((100 - 8) * properties[2] / 100, 19); |
| 60 | techIcon.sizeDelta = new Vector2((100 - 8) * properties[3] / 100, 19); |
| 61 | } |
| 62 | } |
AlienCardProcGen.cs
The generator rolls five attributes out of a shared budget, shuffles them so no two cards weight the same axis identically, and maps each value to a stat bar rendered straight into the card UI. Faces sample from independent sprite arrays — the combinatorics stay cheap, the variety stays high.
Narrative Design
HUD narrative system
News as systemic voice
A dynamic news system scrolls headlines across the HUD and triggers pop-up breaking news at predetermined value benchmarks. Tone sits somewhere between satirical and dead-serious — the absurdity of a species bureaucratizing its own extinction.
News ticker (left) · Breaking news pop-up (right)
Ticker · pop-up
Two registers for the same voice — a low-volume ticker that runs continuously, and a breaking-news interrupt that fires only when game-state benchmarks are crossed. The player learns to read both as feedback.