by Kyle Dhillon
May 2013 - present
Besiege is a single-player real-time strategy and conquest game, written in Java for desktop and Android. Command a custom army in a fully automated procedurally generated world of rivaling factions and kingdoms. Win battles and earn glory, conquer cities and castles, and declare yourself ruler of your very own faction.
Download and play the beta version here: http://princeton.edu/~kdhillon/besiege
Map: Besiege's island map is procedurally generated for each playthrough, using Voronoi graphs, Delaunay triangulation, and Perlin noise functions, in a Java based off the methods described here: http://www-cs-students.stanford.edu/~amitp/game-programming/polygon-map-generation/ The map is populated with over 100 cities, castles and villages, hundreds of armies, and plenty for the player to explore.
AI: Besiege's AI is fully-automated, meaning if left alone without player participation the world can run smoothly forever. Rival factions will develop, kingdoms will fall and new ones will arise to take their place.
=======
Progress: Day 1: background map + camera Day 2: more camera Day 3: cities and army representation Day 4: movement and battles Day 5: player controls and battles (pausing) Day 6: player controls Day 7: installed and learned basic LibGDX Day 8: began translating code from Slick to Libgdx Day 9: continued translating code Day 10: finished translating and began basic AI Day 11: added unit types and got Android functionality Day 12: added garrisoning and improved running Day 13: added Patrol army type and waiting Day 14: added Merchant army type Day 15: added new textures for everything Day 16: added farmers and villages Day 17: added global clock, time, and fast forward Day 18: added morale and battle icon Day 19: added army money and raiding parties Day 20: began making HUD using scene2d UI (minimap failed) Day 21: worked on HUD Day 22: finished basic template for HUD Day 23: continued UI and worked on bottom panel and log Day 24: continued UI, and worked on character and attributes Day 25: continued UI, worked on Party and Soldier Day 26: worked on Weapon and Soldier upgrade tree Day 27: worked on PartyTypes and UpgradePanel Day 28: recreated Battle using new soldier and party types Day 29: worked on PanelBattle and Battle Day 30: added PanelLocation and rewards for battles Day 31: began working on interactions with locations Day 32: worked on army interaction and added los Day 33: added fog of war, split map, and los/fog toggle Day 34: added panelhire, Bandits, cleaned up Battle Day 35: added Faction and crests Day 36: added Faction crests and basics of diplomacy Day 37: added garrisons and Siege Day 38: worked on Siege and expanded player-Location interactions Day 39: added army autorepairing, worked on Noble Day 40: worked on Noble Day 41: added Perlin functionality to Hoten's/Amit's procedural map generation Day 42: modified Army's target-based navigation to support Paths with multiple nodes Day 43: added randomly generated map to game Day 44: worked more on A* pathfinding Day 45: still working on Pathfinding Day 46: finally got basic unoptimized A* pathfinding to work with some bugs Day 47: improved A* pathfinding, optimized visibility graph 10 times faster Day 48: worked on running, reduced freezing, removed islands from map Day 49: removed more freezing, improved graph search, cleaned map edges Day 50: began profiling for bottlenecks, optimized closestHostileArmy() Day 51: added spheres of influence, fixed some patrol and farmer bugs Day 52: fixed freezing and border glitch issues, consolidated distBetween() Day 53: made village spawns not based on cities, added WebGL (HTML5) functionality Day 54: deployed to google app engine besiege-game.appspot.com Day 55: drew out army control flow diagram and restructured Army.act() Day 56: fixed running bug, fixed farmer bug Day 57: fixed Noble and Patrol stuck bug, fixed faction borders Day 58: fixed Merchant bug, added main menu, uploaded to princeton.edu Day 59: added targetOf, fixed containing polygons bug Day 60: fixed player offset bug, fixed retreat time = 1 bug, Day 61: added castle class, cleaned faction location management Day 62: fixed one major memory leak bug Day 63: fixed major bug that would call A* very frequently (armies would still follow garrisoned armies) Day 64: added texts and crests for city names Day 65: began working on battlestage Day 66: added custom weapons to battlestage Day 67: integrated battlestage into game Day 68: added additional features to battlestage Day 69: added different battle environments to battlemap Day 70: added horses and archers to battlestage Day 71: added cover, firing animation, shields to battlestage Day 72: added additional maptypes and formations to battlestage Day 73: added walls and ladders to battlestage Day 74: added siege units and additional formations to battlestage Day 75: made battlestages have the same rewards as regular battles Day 76: made adding walls very easy, added destructable walls Day 77: fixed bugs with walls, integrated battlestage sieges into game Day 78: fixed farmer bug, made factions group better, created version 0.2 Day 79: fixed "sticky player" bug and merchant bug Day 80: worked on researching how to save game state Day 81: fixed bug with crests not disappearing after losing Day 82: started process of simplifying references for eventual saving Day 83: added optional "optimized" setting to map Day 84: continued working on serialization, changed graph to use indices Day 85: finished saving map and armies/locations Day 86: finished basic saving and loading functionality using kryo Day 87: started working on title screen Day 88: finished flame on titlescreen, added rain to kingdom Day 89: fixed button bug, added formation options Day 90: fixed cover bug, added scramble, inline stance Day 91: added joining battles, fame BATTLESTAGE: finish hiding add waves and reinforcements to battles add safeguards against battles getting stuck get austin to start making cool art for additional units later: make archers not shoot at enemies behind a wall... can do simple test but won't account for entrances. make walls not flat add towers add villages and ruins add ballistas add some randomness to which ladder is chosen design new unit tree add mist to certain battlemaps MAP: now: test some optimizations - see if A* is what's making big maps slow. if it is, optimize a* by only looking at nearby points optimize army searches by only looking at armies within ArmyPlayer.closeArmies note that moving around stutters when map has a large amount of pixels. can be solved by intentionally scaling down the pixel size of the map. bug: after upgrade, units don't display in list later: add garrison repairing add cancelling and reforming of sieges make title cooler add severe woundedness gameplay: implement "honor" and baronage for player change "back" button to use a stack fix " upgrade for flail not found!" (allow veteran upgrade) give names to each region (and village names will be the same), and castle names will be "____ castle" or "____ fortress" add city garrison/wealth management fix "economy": sample faction wealth over time and make sure it gradually increases, etc. use completely different names...? ok Belvoir Castle Belvoir Fortress Belvoir Stronghold Belvoir Ruins engine: also figure out why some things happen twice? fix army following--path doesn't account for borders when chasing--should follow same path as party. use shape renderer to draw map instead of drawing entire map (large) every time, see if improvements optimizations: improve battle mechanic! (don't just RNG every frame...) map improvements: fix visibility graph with penninsulas add rivers (just more impassable edges--and check for in between corners) utilize map areas (farmland = more wealth, mountains make you slow, etc?) aesthetics: add rain/lightning! add cool loading screen smooth out camera centering add minimap (use clipping?) improve asthetics of map (add rough edges and noise/textures, roads, forests, other details) test on android add ruins castles: serve as military strongholds (better defense than most towns, more troops, not much economic benefit but important for territorial control. Spawns scouting parties. final map goals: 40 cities (or bigger!) 25 castles 10 factions (6 large, 4 small) and bandits areas bandits spawn, bandit camps kinda like villages? sphere of influence inefficiencies: army detect nearby (improved on day 50) party check upgrade adding edge noise: add noise to each Voronoi edge before drawing, making sure still hits endpoints and crosses Delaunay edge. Use Amit's recursive function in NoisyEdges.as (can do this either just asthetically or actually break down every line into much smaller lines--probably slower pathfinding, etc but more natural) Level/Tier info: Tr Lvl atk def spd 0 1 1 1 1 Farmer 1 3 1 1 2 Vet. Farmer 2 5 1 2 2 Militia 3 7 2 2 2 Vet. Militia 4 10 2 3 2 Tier 4 (spearman etc) 5 12 3 3 2 Tier 5 (vet spearman) 6 15 3 3 3 Tier 6 (pikeman) 7 18 3 4 3 Tier 7 (vet. pikeman) 8 22 4 4 3 Tier 8 (pikemaster) 9 25 4 4 4 Tier 9 (vet pikemaster) World goal: The player inhabits a vast kingdom comprised of many factions of various sizes, each controlling their own sets of locations including cities, castles and villages. Each faction is trying to maximize their own influence and wealth by conquering more territory and trading. Factions at war develop bitter rivalries, factions at peace forge uneasy alliances. Bandits and thieves raid trade routes and farmers, and rogue rebel factions occassionally arise. Noblemen command sizable parties to attack other factions and defend their own, while bandit warlords can rise up to challenge them. (think about adding a "party level" as parties win more and more battles?) AI goal: (requires a lot of 'tuning') A full automated thriving economy exists, and the gameworld should be able to run without player interaction for days without imbalance occurring. Powerful empires should fall given enough time, and new ones should rise up to take their place. Factions, cities, and parties on average should have an average wealth that remains generally the same, with some getting very rich and some very poor. Gameplay goal: Begin by leading a ragtag band of soldiers, trying to gain wealth, fame, and power. As you, their leader, become more respected and capable, your party can grow stronger. By honing your party, you can try taking on bigger and stronger targets, determining your relation with various factions. Once strong enough, you can take your shot at capturing a city or town. Then you can create your own faction and declare yourself as king. Other factions will take notice and may react violently, opening up opportunities for more expansion or annihilation. You should be able to organize your own merchants, patrols, siege parties, etc. Interesting mechanic later on - crosstraining? ie - having units of certain level in your party allows you to create blends of multiple units eg - having a Firespitter in your party allows your Fanatics to become self-destructing? eg - Spirit Walker: Unit ideas: Standard Hunter (shortbow, club) Special Cultures: Swamp(swamp warriors) Marshman (club) Archer (recurve bow) Firebomber (firebombs, club) Firespitter (firebombs, torch) Kalas (valley warriors) Recruit (spear) Warrior (sword) Warrior (axe) Hero (dual swords) Blade Thrower (throwing knives) Dura (crag warriors) Follower (club) Fanatic (2xDagger) Martyr (firebomb) Priest (staff) Intu (alpine warriors) (?) Fisherman (knife) Trapper (Knives) Hunter (Spear) Spirit Walker (staff) Wolfblood (axe) Zuul (grassland warriors) Warrior (spear) Healer army types and purposes: Farmers - created at villages, farm to gather wealth for cities and villages (Village Patrol) - patrols around villages when they become wealthy enough Merchants - created at cities, trade between cities to gather wealth for cities Patrol - created at cities, patrol around cities when wealthy enough (Siege Party) (Travelers) (Pilgrims) (Monks) (Scouts) (Horsemen) (Barbarians) (Deserters) (Shepherds) Noblemen - fight each other, raid villages, and besiege cities (King) (150+?) Archduke Prince Duke (100+) Marquis (80-100) Earl (Count)(60-80) Baron (40-60) (Knights are not noble) Bandits - created randomly, attack farmers, patrols (raid villages?) (Raiders) - created randomly, attack farmers, patrols, and raid villages? Gameplay: control a party on the map. Party screen/window contains info about who is in your party, upgrades, etc. Character screen/window contains player info. tips: use object pooling for Armies (allows reuse and efficient memory use) when drawing background image, disable blending! or perhaps scene2d makes the most sense for this type of game (actors and stage!) ^definitely makes the most sense (actions, draws all together, etc) tuning up later: check maxSpritesInBatch (int) field of SpriteBatch after running the program and set max to that number ideas: make battles 2d fights with rpg maker style characters more details: require separate engine, allow player to control units like rts, lay out on grid formation. cool idea make visits to cities 2d rpg maker style make a plot where you play as both the good guy and the bad king he's trying to defeat (through flashbacks to his rise to power) - focus on the moral dilemmas and parallelisms? future games http://en.wikipedia.org/wiki/Yaoguai