From 9817d67461a9ffa7c8e3c291728da0b94600723f Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Sun, 12 Feb 2017 21:04:31 -0500 Subject: [PATCH] More initial codework on rogue miner. --- code/__defines/roguemining_vr.dm | 11 ++ code/game/area/Space Station 13 areas_vr.dm | 3 + code/modules/admin/admin_verbs.dm | 1 + code/modules/rogueminer_vr/asteroid.dm | 95 +++++++++++++++ code/modules/rogueminer_vr/controller.dm | 26 +++++ code/modules/rogueminer_vr/debug.dm | 8 ++ code/modules/rogueminer_vr/landmarks.dm | 17 +++ code/modules/rogueminer_vr/progress.dm | 5 - code/modules/rogueminer_vr/wrappers.dm | 122 ++++++++++++++++++++ code/modules/rogueminer_vr/zonegen.dm | 5 - code/modules/rogueminer_vr/zonemaster.dm | 115 +++++++++++++++++- 11 files changed, 397 insertions(+), 11 deletions(-) create mode 100644 code/__defines/roguemining_vr.dm create mode 100644 code/modules/rogueminer_vr/asteroid.dm create mode 100644 code/modules/rogueminer_vr/controller.dm create mode 100644 code/modules/rogueminer_vr/debug.dm create mode 100644 code/modules/rogueminer_vr/landmarks.dm delete mode 100644 code/modules/rogueminer_vr/progress.dm create mode 100644 code/modules/rogueminer_vr/wrappers.dm delete mode 100644 code/modules/rogueminer_vr/zonegen.dm diff --git a/code/__defines/roguemining_vr.dm b/code/__defines/roguemining_vr.dm new file mode 100644 index 00000000000..fa5d3eeaa97 --- /dev/null +++ b/code/__defines/roguemining_vr.dm @@ -0,0 +1,11 @@ +//Some defines for the rogue miner. +#define RM_STARTING_DIFF 50 + +#define RM_DIFF_TIER_TWO 100 +#define RM_DIFF_TIER_THREE 300 +#define RM_DIFF_TIER_FOUR 400 +#define RM_DIFF_TIER_FIVE 500 +#define RM_DIFF_CHAOS_REIGNS 1000 + +#define RM_DIFF_DECAY_TIME 18000 +#define RM_DIFF_DECAY_AMT 50 \ No newline at end of file diff --git a/code/game/area/Space Station 13 areas_vr.dm b/code/game/area/Space Station 13 areas_vr.dm index fa3b0355556..be74e09a95b 100644 --- a/code/game/area/Space Station 13 areas_vr.dm +++ b/code/game/area/Space Station 13 areas_vr.dm @@ -78,6 +78,9 @@ icon_state = "shuttle" //Rouguelike Mining +/area/asteroid/rogue + var/asteroid_spawns = list() + /area/asteroid/rogue/zone1 name = "Asteroid Belt Zone 1" icon_state = "red2" diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 9fc8e43e732..b5e0f936827 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -195,6 +195,7 @@ var/list/admin_verbs_debug = list( /client/proc/SDQL_query, /client/proc/SDQL2_query, /client/proc/Jump, + /client/proc/debug_rogueminer, /client/proc/jumptomob, /client/proc/jumptocoord, /client/proc/dsay, diff --git a/code/modules/rogueminer_vr/asteroid.dm b/code/modules/rogueminer_vr/asteroid.dm new file mode 100644 index 00000000000..32c8cbe7c47 --- /dev/null +++ b/code/modules/rogueminer_vr/asteroid.dm @@ -0,0 +1,95 @@ +////////////////////////////// +// An asteroid object, could be spawned in, or not +// May or may not include phat lewt +////////////////////////////// + +/datum/rogue/asteroid + //Composition + var/type_wall = /turf/simulated/mineral //Type of turf used to generate the asteroid + var/type_under = /turf/simulated/mineral/floor //Type of turf that's under the normal one + + //Dimensions + var/coresize = 3 //The size of the center square + var/armsize = 3 //(max)Length of the 'arms' on the sides + var/width = 9 + + //Other Attribs + var/hollow = 0 //Might be hollow for loot injection purposes + var/spawned = 0 //Is this asteroid in-play right now + var/difficulty = 0 //Difficulty this asteroid was created at + + //Locational stats + var/obj/effect/landmark/asteroid_spawn/mylandmark //The landmark I'm spawned at, if any. + + //Asteroid map + //The map struct is: + // map list() + // 0 = list() + // 1 = list() //These are x coordinates + // 2 = list() + // ^0 = list() + // 1 = list() //These are y coordinates at x2 + // 2 = list() + // ^type1 + // type2 //These are items/objects at the coordinate + // type3 //This would be object 3 at x2,y2 + var/list/map = list() + +//Builds an empty map +/datum/rogue/asteroid/New(var/core, var/arm, var/tw, var/tu) + if(core) + coresize = core + if(arm) + armsize = arm + if(tw) + type_wall = tw + if(tu) + type_under = tu + + width = coresize+(armsize*2) + + world << "calling xy_lists with [width]" + xy_lists(width) + + +//Adds something to a spot in the asteroid map +/datum/rogue/asteroid/proc/spot_add(var/x,var/y,var/thing) + if(!x || !y || !thing) + return + + var/list/work = map[x][y] + work += thing + +//Removes something from a spot in the asteroid map +/datum/rogue/asteroid/proc/spot_remove(var/x,var/y,var/thing) + if(!x || !y || !thing) + return + + var/list/work = map[x][y] + work -= thing + +//Just removes everything from a spot in the asteroid map +/datum/rogue/asteroid/proc/spot_clear(var/x,var/y) + if(!x || !y) + return + + var/list/work = map[x][y] + work.Cut() + +//Given a size it will create the lists if they don't already exist +/datum/rogue/asteroid/proc/xy_lists(var/gridsize) + map = list() + + world << "Now in xy_lists" + for(var/Ix=0, Ix < gridsize, Ix++) + world << "Making new 'x' list for x=[Ix]" + var/list/curr_x = list() + for(var/Iy=0, Iy < gridsize, Iy++) + world << "Making new 'y' list for y=[Iy]" + var/list/curr_y = list() + curr_x[++curr_x.len] = curr_y + world << "Inserted new 'y', x=[Ix] list now [curr_x.len] long" + map[++map.len] = curr_x + world << "Inserted new 'x', map now [map.len] long" + + return map diff --git a/code/modules/rogueminer_vr/controller.dm b/code/modules/rogueminer_vr/controller.dm new file mode 100644 index 00000000000..25239007f3e --- /dev/null +++ b/code/modules/rogueminer_vr/controller.dm @@ -0,0 +1,26 @@ +////////////////////////////// +// Tracks mining zone progress and decay +// Makes mining zones more difficult as you enter new ones +// THIS IS THE FIRST UNIT INITIALIZED THAT STARTS EVERYTHING +////////////////////////////// +var/datum/controller/rogue/rm_controller = new() + +/datum/controller/rogue + var/list/datum/rogue/zonemaster/all_zones = list() + + var/difficulty = RM_STARTING_DIFF + + //The current mining zone that the shuttle goes to and whatnot + var/area/current + +/datum/controller/rogue/New() + //How many zones are we working with here + for(var/area/asteroid/rogue/A in world) + all_zones += new /datum/rogue/zonemaster(A) + +/datum/controller/rogue/proc/decay(var/manual = 0) + difficulty = max(difficulty-RM_DIFF_DECAY_AMT,RM_STARTING_DIFF) + if(!manual) //If it was called manually somehow, then don't start the timer, just decay now. + spawn(RM_DIFF_DECAY_TIME) + decay() + return difficulty \ No newline at end of file diff --git a/code/modules/rogueminer_vr/debug.dm b/code/modules/rogueminer_vr/debug.dm new file mode 100644 index 00000000000..366d9da0270 --- /dev/null +++ b/code/modules/rogueminer_vr/debug.dm @@ -0,0 +1,8 @@ +/client/proc/debug_rogueminer() + set category = "Debug" + set name = "Debug RogueMiner" + set desc = "Debug the RogueMiner controller." + + if(!holder) return + debug_variables(rm_controller) + feedback_add_details("admin_verb","DRM") \ No newline at end of file diff --git a/code/modules/rogueminer_vr/landmarks.dm b/code/modules/rogueminer_vr/landmarks.dm new file mode 100644 index 00000000000..db23b757fc1 --- /dev/null +++ b/code/modules/rogueminer_vr/landmarks.dm @@ -0,0 +1,17 @@ +////////////////////////////// +// Landmarks for asteroid positioning +// Just makes the placement more safe/sane +////////////////////////////// + +/obj/asteroid_spawner + name = "asteroid spawn" + icon = 'icons/mob/screen1.dmi' + icon_state = "x2" + invisibility = 101 + anchored = 1 + var/datum/rogue/asteroid/myasteroid + +/obj/asteroid_spawner/New() + if(loc && istype(loc,/turf/space) && istype(loc.loc,/area/asteroid/rogue)) + var/area/asteroid/rogue/A = loc.loc + A.asteroid_spawns += src diff --git a/code/modules/rogueminer_vr/progress.dm b/code/modules/rogueminer_vr/progress.dm deleted file mode 100644 index 2e69cfa27db..00000000000 --- a/code/modules/rogueminer_vr/progress.dm +++ /dev/null @@ -1,5 +0,0 @@ -////////////////////////////// -// Tracks mining zone progress and decay -// Makes mining zones more difficult as you enter new ones -////////////////////////////// - diff --git a/code/modules/rogueminer_vr/wrappers.dm b/code/modules/rogueminer_vr/wrappers.dm new file mode 100644 index 00000000000..7c92fc946f2 --- /dev/null +++ b/code/modules/rogueminer_vr/wrappers.dm @@ -0,0 +1,122 @@ +/obj/effect/step_trigger/teleporter/random/rogue + teleport_z = 7 + teleport_z_offset = 7 + +//Sure, I could probably do this with math. But I'm tired. +/* + S1 200 + ----------------------------------- + |001/199 099/199|102/199 199/199| + | | |S + | A1 | A2 |2 + | | | +0|001/102 099/102|102/102 199/102|2 +0|---------------------------------|0 +0|001/099 099/099|102/099 199/099|0 + | | | +S| A3 | A4 | +4| | | + |001/001 099/001|102/001 199/001| + ----------------------------------- + 200 S3 +*/ + +//////////// AREA 1 +/obj/effect/step_trigger/teleporter/random/rogue/fourbyfour/A1S1 + teleport_x = 1 + teleport_y = 102 + teleport_x_offset = 99 + teleport_y_offset = 102 + +/obj/effect/step_trigger/teleporter/random/rogue/fourbyfour/A1S2 + teleport_x = 1 + teleport_y = 102 + teleport_x_offset = 1 + teleport_y_offset = 199 + +/obj/effect/step_trigger/teleporter/random/rogue/fourbyfour/A1S3 + teleport_x = 1 + teleport_y = 199 + teleport_x_offset = 99 + teleport_y_offset = 199 + +/obj/effect/step_trigger/teleporter/random/rogue/fourbyfour/A1S4 + teleport_x = 99 + teleport_y = 102 + teleport_x_offset = 99 + teleport_y_offset = 199 + +//////////// AREA 2 +/obj/effect/step_trigger/teleporter/random/rogue/fourbyfour/A2S1 + teleport_x = 102 + teleport_y = 102 + teleport_x_offset = 199 + teleport_y_offset = 102 + +/obj/effect/step_trigger/teleporter/random/rogue/fourbyfour/A2S2 + teleport_x = 102 + teleport_y = 102 + teleport_x_offset = 102 + teleport_y_offset = 199 + +/obj/effect/step_trigger/teleporter/random/rogue/fourbyfour/A2S3 + teleport_x = 102 + teleport_y = 199 + teleport_x_offset = 199 + teleport_y_offset = 199 + +/obj/effect/step_trigger/teleporter/random/rogue/fourbyfour/A2S4 + teleport_x = 199 + teleport_y = 102 + teleport_x_offset = 199 + teleport_y_offset = 199 + +//////////// AREA 3 +/obj/effect/step_trigger/teleporter/random/rogue/fourbyfour/A3S1 + teleport_x = 1 + teleport_y = 1 + teleport_x_offset = 99 + teleport_y_offset = 1 + +/obj/effect/step_trigger/teleporter/random/rogue/fourbyfour/A3S2 + teleport_x = 1 + teleport_y = 1 + teleport_x_offset = 1 + teleport_y_offset = 99 + +/obj/effect/step_trigger/teleporter/random/rogue/fourbyfour/A3S3 + teleport_x = 1 + teleport_y = 99 + teleport_x_offset = 99 + teleport_y_offset = 99 + +/obj/effect/step_trigger/teleporter/random/rogue/fourbyfour/A3S4 + teleport_x = 99 + teleport_y = 1 + teleport_x_offset = 99 + teleport_y_offset = 99 + +//////////// AREA 4 +/obj/effect/step_trigger/teleporter/random/rogue/fourbyfour/A4S1 + teleport_x = 102 + teleport_y = 1 + teleport_x_offset = 199 + teleport_y_offset = 1 + +/obj/effect/step_trigger/teleporter/random/rogue/fourbyfour/A4S2 + teleport_x = 102 + teleport_y = 1 + teleport_x_offset = 102 + teleport_y_offset = 99 + +/obj/effect/step_trigger/teleporter/random/rogue/fourbyfour/A4S3 + teleport_x = 102 + teleport_y = 99 + teleport_x_offset = 199 + teleport_y_offset = 99 + +/obj/effect/step_trigger/teleporter/random/rogue/fourbyfour/A4S4 + teleport_x = 199 + teleport_y = 1 + teleport_x_offset = 199 + teleport_y_offset = 99 diff --git a/code/modules/rogueminer_vr/zonegen.dm b/code/modules/rogueminer_vr/zonegen.dm deleted file mode 100644 index a0f824d8895..00000000000 --- a/code/modules/rogueminer_vr/zonegen.dm +++ /dev/null @@ -1,5 +0,0 @@ -////////////////////////////// -// Mining zone generator for mining roguelike game -// Regenerates zones based on parameters passed into it -////////////////////////////// - diff --git a/code/modules/rogueminer_vr/zonemaster.dm b/code/modules/rogueminer_vr/zonemaster.dm index 941b65da8bc..f75b393ca60 100644 --- a/code/modules/rogueminer_vr/zonemaster.dm +++ b/code/modules/rogueminer_vr/zonemaster.dm @@ -1,5 +1,118 @@ ////////////////////////////// // The zonemaster object, spawned to track the zone and -// update progress as it is made. +// clean/populate the zone with asteroids and loot ////////////////////////////// +/datum/rogue/zonemaster + //our area + var/area/asteroid/rogue/myarea + + //world.time + var/prepared_at = 0 + var/expires_at = 0 + + //accepting shuttles + var/ready = 0 + + //completely empty + var/clean = 1 + + //in-use spawns from the area + var/obj/asteroid_spawner/list/spawns = list() + +/datum/rogue/zonemaster/New(var/area/A) + ASSERT(A) + myarea = A + +/////////////////////////////// +///// Utility Procs /////////// +/////////////////////////////// + +/datum/rogue/zonemaster/proc/is_occupied() + var/humans = 0 + for(var/mob/living/carbon/human/H in myarea) + if(H.stat < DEAD) //Bodies don't count, no. + humans++ + return humans + +/datum/rogue/zonemaster/proc/has_shuttle() + var/shuttles = 0 //Shh. + for(var/obj/machinery/computer/shuttle_control/C in myarea) + shuttles ++ + return shuttles + +/////////////////////////////// +///// Asteroid Generation ///// +/////////////////////////////// +/datum/rogue/zonemaster/proc/generate_asteroid(var/core_min = 2, var/core_max = 5, var/arm_min = 1, var/arm_max = 3) + var/datum/rogue/asteroid/A = new(rand(core_min,core_max),rand(arm_min,arm_max)) + + //Find the bounding box, basically + A.width = A.coresize+(A.armsize*2) + + //Add the core to the asteroid's map + var/start = round((A.width-A.coresize)/2) + for(var/x = 1; x <= A.coresize, x++) + for(var/y = 1; y <= A.coresize, y++) + A.spot_add(start+x, start+y, A.type_wall) + + //Add the arms to the asteroid's map + //TODO + + return A + +/datum/rogue/zonemaster/proc/enrich_asteroid(var/list/asteroid) + +/datum/rogue/zonemaster/proc/place_asteroid(var/datum/rogue/asteroid/A,var/obj/asteroid_spawner/SP) + SP.myasteroid = A + + //Top-left corner of our bounding box + var/TLx = SP.x - (A.width/2) + var/TLy = SP.y - (A.width/2) + + for(var/x in A.map) + for(var/y in A.map[x]) + for(var/turf/T in A.map[x][y]) + var/turf/P = locate(TLx+x,TLy+y,SP.z) //Find previous turf + P.ChangeTurf(T) + //TODO spawn everything that's not a turf + +/////////////////////////////// +///// Zone Population ///////// +/////////////////////////////// + +//Overall 'prepare' proc (marks as ready) +/datum/rogue/zonemaster/proc/prepare_zone() + clean = 0 + + //TODO take difficulty into account + randomize_spawns() + for(var/obj/asteroid_spawner/SP in spawns) + var/datum/rogue/asteroid/A = generate_asteroid() + place_asteroid(A,SP) + + ready = 1 + +//Randomize the landmarks that are enabled +/datum/rogue/zonemaster/proc/randomize_spawns(var/chance = 50) + spawns.Cut() + for(var/obj/asteroid_spawner/SP in myarea.asteroid_spawns) + if(prob(chance)) + spawns += SP + +//Call asteroid generation and place over and over proc + +/////////////////////////////// +///// Zone Cleaning /////////// +/////////////////////////////// + +//Overall 'destroy' proc (marks as unready) +//Lazy mostly-destroy proc aimed at landmarks +//Faster destroy-everything-else proc + +/////////////////////////////// +///// Mysterious Mystery ////// +/////////////////////////////// + +//Generate an "interesting" asteroid instead of a normal one +//Throw a meteor at a player in the zone \ No newline at end of file