Merge pull request #12240 from Fox-McCloud/turf-mineral-lava-update

Lavaland Update Part 3: Fixes Megafauna Spawning, Rivers, and Turfs
This commit is contained in:
variableundefined
2019-09-10 07:54:08 -04:00
committed by GitHub
12 changed files with 231 additions and 185 deletions
+43
View File
@@ -0,0 +1,43 @@
GLOBAL_LIST_EMPTY(typelists)
#ifndef TESTING
/datum/proc/typelist(key, list/values = list())
var/list/mytypelist = GLOB.typelists[type] || (GLOB.typelists[type] = list())
return mytypelist[key] || (mytypelist[key] = values.Copy())
#else
// mostly the same code as above, just more verbose, slower and has tallying for saved lists
/datum/proc/typelist(key, list/values)
if (!values)
values = list()
GLOB.typelistkeys |= key
if (GLOB.typelists[type])
if (GLOB.typelists[type][key])
GLOB.typelists[type]["[key]-saved"]++
return GLOB.typelists[type][key]
else
GLOB.typelists[type][key] = values.Copy()
else
GLOB.typelists[type] = list()
GLOB.typelists[type][key] = values.Copy()
return GLOB.typelists[type][key]
GLOBAL_LIST_EMPTY(typelistkeys)
/proc/tallytypelistsavings()
var/savings = list()
var/saveditems = list()
for (var/key in GLOB.typelistkeys)
savings[key] = 0
saveditems[key] = 0
for (var/type in GLOB.typelists)
for (var/saving in savings)
if (GLOB.typelists[type]["[saving]-saved"])
savings[saving] += GLOB.typelists[type]["[saving]-saved"]
saveditems[saving] += (GLOB.typelists[type]["[saving]-saved"] * length(GLOB.typelists[type][saving]))
for (var/saving in savings)
to_chat(world, "Savings for [saving]: [savings[saving]] lists, [saveditems[saving]] items")
#endif
-2
View File
@@ -34,8 +34,6 @@ GLOBAL_LIST_INIT(restricted_camera_networks, list(
"Hotel"
)) //Those networks can only be accessed by preexisting terminals. AIs and new terminals can't use them.
GLOBAL_LIST_INIT(mineral_turfs, list())
GLOBAL_LIST_INIT(ruin_landmarks, list())
GLOBAL_LIST_INIT(round_end_sounds, list(
+1 -1
View File
@@ -31,7 +31,7 @@ SUBSYSTEM_DEF(mapping)
if (mining_type == "lavaland")
// Spawn Lavaland ruins and rivers.
seedRuins(list(level_name_to_num(MINING)), config.lavaland_budget, /area/lavaland/surface/outdoors/unexplored, lava_ruins_templates)
spawn_rivers()
spawn_rivers(list(level_name_to_num(MINING)))
else
// Populate mining Z-level hidden rooms
for(var/i = 0, i < max_secret_rooms, i++)
+1 -7
View File
@@ -45,13 +45,7 @@
loc.handle_atom_del(src)
for(var/atom/movable/AM in contents)
qdel(AM)
var/turf/un_opaque
if(opacity && isturf(loc))
un_opaque = loc
loc = null
if(un_opaque)
un_opaque.recalc_atom_opacity()
if(pulledby)
if(pulledby.pulling == src)
pulledby.pulling = null
@@ -120,7 +114,7 @@
return
if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1) //separated from our puller and not in the middle of a diagonal move.
pulledby.stop_pulling()
/atom/movable/proc/can_be_pulled(user, grab_state, force)
if(src == user || !isturf(loc))
return FALSE
+1 -1
View File
@@ -492,7 +492,7 @@
playsound(src.loc, 'sound/weapons/genhit.ogg', 100, 1)
var/turf/space/T
for(T in orange(1, src))
T.ChangeTurf(/turf/simulated/floor/plating/)
T.ChangeTurf(/turf/simulated/floor/plating)
else
atom_say("Something slams into the floor around [src] - luckily, it didn't get through!")
playsound(src.loc, 'sound/effects/bang.ogg', 20, 1)
@@ -77,7 +77,7 @@
/turf/simulated/floor/plating/asteroid/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill)
for(var/turf/simulated/floor/plating/asteroid/M in range(1, drill.chassis))
if((get_dir(drill.chassis, M) & drill.chassis.dir) && !M.dug)
M.gets_dug()
M.getDug()
drill.log_message("Drilled through [src]")
drill.move_ores()
+85 -60
View File
@@ -1,6 +1,8 @@
/**********************Asteroid**************************/
/turf/simulated/floor/plating/asteroid
gender = PLURAL
name = "asteroid sand"
baseturf = /turf/simulated/floor/plating/asteroid
icon_state = "asteroid"
@@ -8,17 +10,32 @@
footstep_sounds = list()
var/environment_type = "asteroid"
var/turf_type = /turf/simulated/floor/plating/asteroid //Because caves do whacky shit to revert to normal
var/dug = 0 //0 = has not yet been dug, 1 = has already been dug
var/sand_type = /obj/item/stack/ore/glass
var/floor_variance = 20 //probability floor has a different icon state
var/obj/item/stack/digResult = /obj/item/stack/ore/glass/basalt
var/dug
/turf/simulated/floor/plating/asteroid/New()
/turf/simulated/floor/plating/asteroid/Initialize(mapload)
var/proper_name = name
..()
. = ..()
name = proper_name
if(prob(floor_variance))
icon_state = "[environment_type][rand(0,12)]"
/turf/simulated/floor/plating/asteroid/proc/getDug()
new digResult(src, 5)
icon_plating = "[environment_type]_dug"
icon_state = "[environment_type]_dug"
dug = TRUE
/turf/simulated/floor/plating/asteroid/proc/can_dig(mob/user)
if(!dug)
return TRUE
if(user)
to_chat(user, "<span class='notice'>Looks like someone has dug here already.</span>")
/turf/simulated/floor/plating/asteroid/try_replace_tile(obj/item/stack/tile/T, mob/user, params)
return
/turf/simulated/floor/plating/asteroid/burn_tile()
return
@@ -31,46 +48,50 @@
/turf/simulated/floor/plating/asteroid/remove_plating()
return
/turf/simulated/floor/plating/asteroid/ex_act(severity, target)
/turf/simulated/floor/plating/asteroid/ex_act(severity)
if(!can_dig())
return
switch(severity)
if(3)
return
if(2)
if(prob(20))
gets_dug()
getDug()
if(1)
gets_dug()
getDug()
/turf/simulated/floor/plating/asteroid/attackby(obj/item/W, mob/user, params)
/turf/simulated/floor/plating/asteroid/attackby(obj/item/I, mob/user, params)
//note that this proc does not call ..()
if(!W || !user)
return 0
if(!I|| !user)
return FALSE
if((istype(I, /obj/item/shovel) || istype(I, /obj/item/pickaxe)))
if(!can_dig(user))
return TRUE
if((istype(W, /obj/item/shovel) || istype(W, /obj/item/pickaxe)))
var/turf/T = get_turf(user)
if(!istype(T))
return
if(dug)
to_chat(user, "<span class='warning'>This area has already been dug!</span>")
return
to_chat(user, "<span class='notice'>You start digging...</span>")
playsound(src, W.usesound, 50, 1)
if(do_after(user, 20 * W.toolspeed, target = src))
to_chat(user, "<span class='notice'>You dig a hole.</span>")
gets_dug()
return
else if(istype(W,/obj/item/storage/bag/ore))
var/obj/item/storage/bag/ore/S = W
playsound(src, I.usesound, 50, TRUE)
if(do_after(user, 40 * I.toolspeed, target = src))
if(!can_dig(user))
return TRUE
to_chat(user, "<span class='notice'>You dig a hole.</span>")
getDug()
return TRUE
else if(istype(I, /obj/item/storage/bag/ore))
var/obj/item/storage/bag/ore/S = I
if(S.collection_mode == 1)
for(var/obj/item/stack/ore/O in src.contents)
O.attackby(W,user)
for(var/obj/item/stack/ore/O in contents)
O.attackby(I, user)
return
else if(istype(W, /obj/item/stack/tile))
var/obj/item/stack/tile/Z = W
else if(istype(I, /obj/item/stack/tile))
var/obj/item/stack/tile/Z = I
if(!Z.use(1))
return
if(istype(Z, /obj/item/stack/tile/plasteel)) // Turn asteroid floors into plating by default
@@ -79,25 +100,14 @@
ChangeTurf(Z.turf_type, keep_icon = FALSE)
playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
/turf/simulated/floor/plating/asteroid/proc/gets_dug()
if(dug)
return
for(var/i in 1 to 5)
new sand_type(src)
dug = 1
icon_plating = "[environment_type]_dug"
icon_state = "[environment_type]_dug"
slowdown = 0
return
/turf/simulated/floor/plating/asteroid/basalt
name = "volcanic floor"
baseturf = /turf/simulated/floor/plating/asteroid/basalt
icon_state = "basalt"
icon_plating = "basalt"
environment_type = "basalt"
sand_type = /obj/item/stack/ore/glass/basalt
floor_variance = 15
digResult = /obj/item/stack/ore/glass/basalt
/turf/simulated/floor/plating/asteroid/basalt/lava //lava underneath
baseturf = /turf/simulated/floor/plating/lava/smooth
@@ -107,10 +117,14 @@
oxygen = 0
nitrogen = 0
/turf/simulated/floor/plating/asteroid/basalt/Initialize()
/turf/simulated/floor/plating/asteroid/basalt/Initialize(mapload)
. = ..()
set_basalt_light(src)
/turf/simulated/floor/plating/asteroid/basalt/getDug()
set_light(0)
return ..()
/proc/set_basalt_light(turf/simulated/floor/B)
switch(B.icon_state)
if("basalt1", "basalt2", "basalt3")
@@ -118,11 +132,6 @@
if("basalt5", "basalt9")
B.set_light(1.4, 0.6, LIGHT_COLOR_LAVA) //barely anything!
/turf/simulated/floor/plating/asteroid/basalt/gets_dug()
if(!dug)
set_light(0)
..()
///////Surface. The surface is warm, but survivable without a suit. Internals are required. The floors break to chasms, which drop you into the underground.
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface
@@ -138,9 +147,10 @@
nitrogen = 0
turf_type = /turf/simulated/floor/plating/asteroid/airless
#define SPAWN_MEGAFAUNA "MEGAFAUNA"
#define SPAWN_MEGAFAUNA "bluh bluh huge boss"
#define SPAWN_BUBBLEGUM 6
GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/megafauna/dragon = 4, /mob/living/simple_animal/hostile/megafauna/colossus = 2, /mob/living/simple_animal/hostile/megafauna/bubblegum = 6))
GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/megafauna/dragon = 4, /mob/living/simple_animal/hostile/megafauna/colossus = 2, /mob/living/simple_animal/hostile/megafauna/bubblegum = SPAWN_BUBBLEGUM))
/turf/simulated/floor/plating/asteroid/airless/cave
var/length = 100
@@ -169,22 +179,20 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
/turf/simulated/floor/plating/asteroid/airless/cave/volcanic/has_data //subtype for producing a tunnel with given data
has_data = TRUE
/turf/simulated/floor/plating/asteroid/airless/cave/New()
/turf/simulated/floor/plating/asteroid/airless/cave/Initialize(mapload)
if (!mob_spawn_list)
mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goldgrub = 1, /mob/living/simple_animal/hostile/asteroid/goliath = 5, /mob/living/simple_animal/hostile/asteroid/basilisk = 4, /mob/living/simple_animal/hostile/asteroid/hivelord = 3)
if (!megafauna_spawn_list)
megafauna_spawn_list = GLOB.megafauna_spawn_list
if (!flora_spawn_list)
flora_spawn_list = list(/obj/structure/flora/ash/leaf_shroom = 2 , /obj/structure/flora/ash/cap_shroom = 2 , /obj/structure/flora/ash/stem_shroom = 2 , /obj/structure/flora/ash/cacti = 1, /obj/structure/flora/ash/tall_shroom = 2)
. = ..()
if(!has_data)
produce_tunnel_from_data()
..()
/turf/simulated/floor/plating/asteroid/airless/cave/proc/get_cave_data(set_length, exclude_dir = -1)
// If set_length (arg1) isn't defined, get a random length; otherwise assign our length to the length arg.
@@ -234,7 +242,7 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me
if(istype(tunnel))
// Small chance to have forks in our tunnel; otherwise dig our tunnel.
if(i > 3 && prob(20))
var/turf/simulated/floor/plating/asteroid/airless/cave/C = tunnel.ChangeTurf(data_having_type,FALSE,TRUE)
var/turf/simulated/floor/plating/asteroid/airless/cave/C = tunnel.ChangeTurf(data_having_type, FALSE, TRUE)
C.going_backwards = FALSE
C.produce_tunnel_from_data(rand(10, 15), dir)
else
@@ -260,19 +268,22 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me
SpawnFlora(T)
SpawnMonster(T)
T.ChangeTurf(turf_type,FALSE,FALSE,TRUE)
T.ChangeTurf(turf_type, FALSE, FALSE, TRUE)
/turf/simulated/floor/plating/asteroid/airless/cave/proc/SpawnMonster(turf/T)
if(prob(30))
if(istype(loc, /area/mine/explored) || istype(loc, /area/lavaland/surface/outdoors/explored))
if(istype(loc, /area/mine/explored) || !istype(loc, /area/lavaland/surface/outdoors/unexplored))
return
var/randumb = pickweight(mob_spawn_list)
while(randumb == SPAWN_MEGAFAUNA)
var/maybe_boss = pickweight(megafauna_spawn_list)
if(megafauna_spawn_list[maybe_boss])
randumb = maybe_boss
if(ispath(maybe_boss, /mob/living/simple_animal/hostile/megafauna/bubblegum)) //there can be only one bubblegum, so don't waste spawns on it
megafauna_spawn_list.Remove(maybe_boss)
if(istype(loc, /area/lavaland/surface/outdoors/unexplored/danger)) //this is danger. it's boss time.
var/maybe_boss = pickweight(megafauna_spawn_list)
if(megafauna_spawn_list[maybe_boss])
randumb = maybe_boss
if(ispath(maybe_boss, /mob/living/simple_animal/hostile/megafauna/bubblegum)) //there can be only one bubblegum, so don't waste spawns on it
megafauna_spawn_list.Remove(maybe_boss)
else //this is not danger, don't spawn a boss, spawn something else
randumb = pickweight(mob_spawn_list)
for(var/mob/living/simple_animal/hostile/H in urange(12,T)) //prevents mob clumps
if((ispath(randumb, /mob/living/simple_animal/hostile/megafauna) || ismegafauna(H)) && get_dist(src, H) <= 7)
@@ -286,6 +297,7 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me
return
#undef SPAWN_MEGAFAUNA
#undef SPAWN_BUBBLEGUM
/turf/simulated/floor/plating/asteroid/airless/cave/proc/SpawnFlora(turf/T)
if(prob(12))
@@ -300,6 +312,7 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me
/turf/simulated/floor/plating/asteroid/snow
gender = PLURAL
name = "snow"
desc = "Looks cold."
icon = 'icons/turf/snow.dmi'
@@ -309,7 +322,18 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me
temperature = 180
slowdown = 2
environment_type = "snow"
sand_type = /obj/item/stack/sheet/mineral/snow
planetary_atmos = TRUE
burnt_states = list("snow_dug")
digResult = /obj/item/stack/sheet/mineral/snow
/turf/simulated/floor/plating/asteroid/snow/burn_tile()
if(!burnt)
visible_message("<span class='danger'>[src] melts away!.</span>")
slowdown = 0
burnt = TRUE
icon_state = "snow_dug"
return TRUE
return FALSE
/turf/simulated/floor/plating/asteroid/snow/airless
temperature = TCMB
@@ -322,4 +346,5 @@ GLOBAL_LIST_INIT(megafauna_spawn_list, list(/mob/living/simple_animal/hostile/me
/turf/simulated/floor/plating/asteroid/snow/atmosphere
oxygen = 22
nitrogen = 82
temperature = 180
temperature = 180
planetary_atmos = FALSE
@@ -48,7 +48,7 @@
temperature = 300
planetary_atmos = TRUE
/turf/simulated/floor/indestructible/necropolis/Initialize()
/turf/simulated/floor/indestructible/necropolis/Initialize(mapload)
. = ..()
if(prob(12))
icon_state = "necro[rand(2,3)]"
+90 -104
View File
@@ -6,12 +6,12 @@
icon_state = "rock"
var/smooth_icon = 'icons/turf/smoothrocks.dmi'
smooth = SMOOTH_MORE | SMOOTH_BORDER
canSmoothWith
canSmoothWith = null
baseturf = /turf/simulated/floor/plating/asteroid/airless
temperature = 2.7
opacity = 1
density = 1
blocks_air = 1
density = TRUE
blocks_air = TRUE
layer = EDGED_TURF_LAYER
temperature = TCMB
var/environment_type = "asteroid"
@@ -21,21 +21,18 @@
var/spread = 0 //will the seam spread?
var/spreadChance = 0 //the percentual chance of an ore spreading to the neighbouring tiles
var/last_act = 0
var/scan_state = null //Holder for the image we display when we're pinged by a mining scanner
var/defer_change = FALSE
var/scan_state = "" //Holder for the image we display when we're pinged by a mining scanner
var/defer_change = 0
/turf/simulated/mineral/New()
if (!canSmoothWith)
/turf/simulated/mineral/Initialize(mapload)
if(!canSmoothWith)
canSmoothWith = list(/turf/simulated/mineral)
var/matrix/M = new
M.Translate(-4, -4)
transform = M
icon = smooth_icon
..()
GLOB.mineral_turfs += src
if (mineralType && mineralAmt && spread && spreadChance)
. = ..()
if(mineralType && mineralAmt && spread && spreadChance)
for(var/dir in cardinal)
if(prob(spreadChance))
var/turf/T = get_step(src, dir)
@@ -56,37 +53,34 @@
return TRUE
return ..()
/turf/simulated/mineral/attackby(var/obj/item/pickaxe/P as obj, mob/user as mob, params)
/turf/simulated/mineral/attackby(obj/item/I, mob/user, params)
if(!user.IsAdvancedToolUser())
to_chat(usr, "<span class='warning'>You don't have the dexterity to do this!</span>")
return
if(istype(P, /obj/item/pickaxe))
if(istype(I, /obj/item/pickaxe))
var/obj/item/pickaxe/P = I
var/turf/T = user.loc
if(!isturf(T))
return
if(last_act + (40 * P.toolspeed) > world.time) // Prevents message spam
return
last_act = world.time
to_chat(user, "<span class='notice'>You start picking...</span>")
P.playDigSound()
if(do_after(user, 40 * P.toolspeed, target = src))
if(istype(src, /turf/simulated/mineral)) //sanity check against turf being deleted during digspeed delay
if(ismineralturf(src)) //sanity check against turf being deleted during digspeed delay
to_chat(user, "<span class='notice'>You finish cutting into the rock.</span>")
P.update_icon()
gets_drilled(user)
feedback_add_details("pick_used_mining","[P.name]")
else
return attack_hand(user)
/turf/simulated/mineral/proc/gets_drilled()
if(mineralType && (mineralAmt > 0) && (mineralAmt < 11))
var/i
for(i=0; i < mineralAmt; i++)
new mineralType(src)
if(mineralType && (mineralAmt > 0))
new mineralType(src, mineralAmt)
feedback_add_details("ore_mined","[mineralType]|[mineralAmt]")
for(var/obj/effect/temp_visual/mining_overlay/M in src)
qdel(M)
@@ -94,26 +88,20 @@
addtimer(CALLBACK(src, .proc/AfterChange), 1, TIMER_UNIQUE)
playsound(src, 'sound/effects/break_stone.ogg', 50, 1) //beautiful destruction
if(rand(1, 750) == 1)
visible_message("<span class='notice'>An old dusty crate was buried within!</span>")
new /obj/structure/closet/crate/secure/loot(src)
return
/turf/simulated/mineral/attack_animal(mob/living/simple_animal/user as mob)
if((user.environment_smash & ENVIRONMENT_SMASH_WALLS) || (user.environment_smash & ENVIRONMENT_SMASH_RWALLS))
gets_drilled()
..()
/turf/simulated/mineral/attack_alien(var/mob/living/carbon/alien/M)
/turf/simulated/mineral/attack_alien(mob/living/carbon/alien/M)
to_chat(M, "<span class='notice'>You start digging into the rock...</span>")
playsound(src, 'sound/effects/break_stone.ogg', 50, 1)
playsound(src, 'sound/effects/break_stone.ogg', 50, TRUE)
if(do_after(M, 40, target = src))
to_chat(M, "<span class='notice'>You tunnel into the rock.</span>")
gets_drilled()
gets_drilled(M)
/turf/simulated/mineral/Bumped(AM as mob|obj)
. = ..()
/turf/simulated/mineral/Bumped(atom/movable/AM)
..()
if(ishuman(AM))
var/mob/living/carbon/human/H = AM
if((istype(H.l_hand,/obj/item/pickaxe)) && (!H.hand))
@@ -124,15 +112,15 @@
else if(isrobot(AM))
var/mob/living/silicon/robot/R = AM
if(istype(R.module_active,/obj/item/pickaxe))
attackby(R.module_active,R)
if(istype(R.module_active, /obj/item/pickaxe))
attackby(R.module_active, R)
else if(ismecha(AM))
var/obj/mecha/M = AM
if(istype(M.selected,/obj/item/mecha_parts/mecha_equipment/drill))
if(istype(M.selected, /obj/item/mecha_parts/mecha_equipment/drill))
M.selected.action(src)
/turf/simulated/mineral/ex_act(severity, target)
/turf/simulated/mineral/ex_act(severity)
..()
switch(severity)
if(3)
@@ -145,22 +133,23 @@
gets_drilled(null, 1)
/turf/simulated/mineral/random
var/mineralSpawnChanceList
var/mineralSpawnChanceList = list(/turf/simulated/mineral/uranium = 5, /turf/simulated/mineral/diamond = 1, /turf/simulated/mineral/gold = 10,
/turf/simulated/mineral/silver = 12, /turf/simulated/mineral/plasma = 20, /turf/simulated/mineral/iron = 40, /turf/simulated/mineral/titanium = 11,
/turf/simulated/mineral/gibtonite = 4, /turf/simulated/floor/plating/asteroid/airless/cave = 2, /turf/simulated/mineral/bscrystal = 1)
//Currently, Adamantine won't spawn as it has no uses. -Durandan
var/mineralChance = 13
var/display_icon_state = "rock"
/turf/simulated/mineral/random/New()
if (!mineralSpawnChanceList)
mineralSpawnChanceList = list(
/turf/simulated/mineral/uranium = 5, /turf/simulated/mineral/diamond = 1, /turf/simulated/mineral/gold = 10,
/turf/simulated/mineral/silver = 12, /turf/simulated/mineral/plasma = 20, /turf/simulated/mineral/iron = 40, /turf/simulated/mineral/titanium = 11,
/turf/simulated/mineral/gibtonite = 4, /turf/simulated/floor/plating/asteroid/airless/cave = 2, /turf/simulated/mineral/bscrystal = 1)
if (display_icon_state)
/turf/simulated/mineral/random/Initialize(mapload)
mineralSpawnChanceList = typelist("mineralSpawnChanceList", mineralSpawnChanceList)
if(display_icon_state)
icon_state = display_icon_state
..()
. = ..()
if (prob(mineralChance))
var/path = pickweight(mineralSpawnChanceList)
var/turf/T = ChangeTurf(path,FALSE,TRUE)
var/turf/T = ChangeTurf(path, FALSE, TRUE)
if(T && ismineralturf(T))
var/turf/simulated/mineral/M = T
@@ -191,7 +180,6 @@
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
defer_change = 1
mineralSpawnChanceList = list(
/turf/simulated/mineral/uranium/volcanic = 35, /turf/simulated/mineral/diamond/volcanic = 30, /turf/simulated/mineral/gold/volcanic = 45, /turf/simulated/mineral/titanium/volcanic = 45,
@@ -212,7 +200,6 @@
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
defer_change = 1
mineralChance = 10
@@ -223,9 +210,9 @@
/turf/simulated/mineral/random/labormineral
mineralSpawnChanceList = list(
/turf/simulated/mineral/uranium = 2, /turf/simulated/mineral/diamond = 1, /turf/simulated/mineral/gold = 3, /turf/simulated/mineral/titanium = 4,
/turf/simulated/mineral/silver = 6, /turf/simulated/mineral/plasma = 15, /turf/simulated/mineral/iron = 80,
/turf/simulated/mineral/gibtonite = 3)
/turf/simulated/mineral/uranium = 3, /turf/simulated/mineral/diamond = 1, /turf/simulated/mineral/gold = 8, /turf/simulated/mineral/titanium = 8,
/turf/simulated/mineral/silver = 20, /turf/simulated/mineral/plasma = 30, /turf/simulated/mineral/iron = 95,
/turf/simulated/mineral/gibtonite = 2)
icon_state = "rock_labor"
/turf/simulated/mineral/random/labormineral/volcanic
@@ -235,12 +222,11 @@
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
defer_change = 1
mineralSpawnChanceList = list(
/turf/simulated/mineral/uranium/volcanic = 2, /turf/simulated/mineral/diamond/volcanic = 1, /turf/simulated/mineral/gold/volcanic = 3, /turf/simulated/mineral/titanium/volcanic = 4,
/turf/simulated/mineral/silver/volcanic = 6, /turf/simulated/mineral/plasma/volcanic = 15, /turf/simulated/mineral/iron/volcanic = 80,
/turf/simulated/mineral/gibtonite/volcanic = 3)
/turf/simulated/mineral/uranium/volcanic = 3, /turf/simulated/mineral/diamond/volcanic = 1, /turf/simulated/mineral/gold/volcanic = 8, /turf/simulated/mineral/titanium/volcanic = 8,
/turf/simulated/mineral/silver/volcanic = 20, /turf/simulated/mineral/plasma/volcanic = 30, /turf/simulated/mineral/bscrystal/volcanic = 1, /turf/simulated/mineral/gibtonite/volcanic = 2,
/turf/simulated/mineral/iron/volcanic = 95)
// Actual minerals
/turf/simulated/mineral/iron
@@ -256,7 +242,6 @@
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
defer_change = 1
/turf/simulated/mineral/uranium
@@ -272,7 +257,6 @@
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
defer_change = 1
/turf/simulated/mineral/diamond
@@ -288,7 +272,6 @@
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
defer_change = 1
/turf/simulated/mineral/gold
@@ -304,7 +287,6 @@
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
defer_change = 1
/turf/simulated/mineral/silver
@@ -320,7 +302,6 @@
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
defer_change = 1
/turf/simulated/mineral/titanium
@@ -336,7 +317,6 @@
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
defer_change = 1
/turf/simulated/mineral/plasma
@@ -352,7 +332,6 @@
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
defer_change = 1
/turf/simulated/mineral/clown
@@ -369,7 +348,6 @@
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
defer_change = 1
/turf/simulated/mineral/mime
@@ -385,7 +363,6 @@
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
defer_change = 1
/turf/simulated/mineral/bscrystal
@@ -402,7 +379,6 @@
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
defer_change = 1
/turf/simulated/mineral/volcanic
@@ -412,7 +388,6 @@
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
/turf/simulated/mineral/volcanic/lava_land_surface
environment_type = "basalt"
@@ -420,6 +395,12 @@
baseturf = /turf/simulated/floor/plating/lava/smooth/lava_land_surface
defer_change = 1
//gibtonite state defines
#define GIBTONITE_UNSTRUCK 0
#define GIBTONITE_ACTIVE 1
#define GIBTONITE_STABLE 2
#define GIBTONITE_DETONATE 3
// Gibtonite
/turf/simulated/mineral/gibtonite
mineralAmt = 1
@@ -427,39 +408,29 @@
spread = 0
scan_state = "rock_Gibtonite"
var/det_time = 8 //Countdown till explosion, but also rewards the player for how close you were to detonation when you defuse it
var/stage = 0 //How far into the lifecycle of gibtonite we are, 0 is untouched, 1 is active and attempting to detonate, 2 is benign and ready for extraction
var/stage = GIBTONITE_UNSTRUCK //How far into the lifecycle of gibtonite we are
var/activated_ckey = null //These are to track who triggered the gibtonite deposit for logging purposes
var/activated_name = null
var/activated_image = null
var/mutable_appearance/activated_overlay
/turf/simulated/mineral/gibtonite/volcanic
environment_type = "basalt"
turf_type = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface
baseturf = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface
oxygen = 14
nitrogen = 23
temperature = 300
planetary_atmos = TRUE
defer_change = 1
/turf/simulated/mineral/gibtonite/New()
/turf/simulated/mineral/gibtonite/Initialize(mapload)
det_time = rand(8,10) //So you don't know exactly when the hot potato will explode
..()
. = ..()
/turf/simulated/mineral/gibtonite/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/mining_scanner) || istype(I, /obj/item/t_scanner/adv_mining_scanner) && stage == 1)
user.visible_message("<span class='notice'>You use [I] to locate where to cut off the chain reaction and attempt to stop it...</span>")
user.visible_message("<span class='notice'>[user] holds [I] to [src]...</span>", "<span class='notice'>You use [I] to locate where to cut off the chain reaction and attempt to stop it...</span>")
defuse()
..()
else
return ..()
/turf/simulated/mineral/gibtonite/proc/explosive_reaction(var/mob/user = null, triggered_by_explosion = 0)
if(stage == 0)
var/image/I = image('icons/turf/smoothrocks.dmi', loc = src, icon_state = "rock_Gibtonite_active", layer = ON_EDGED_TURF_LAYER)
add_overlay(I)
activated_image = I
/turf/simulated/mineral/gibtonite/proc/explosive_reaction(mob/user = null, triggered_by_explosion = 0)
if(stage == GIBTONITE_UNSTRUCK)
activated_overlay = mutable_appearance('icons/turf/smoothrocks.dmi', "rock_Gibtonite_active", ON_EDGED_TURF_LAYER)
add_overlay(activated_overlay)
name = "gibtonite deposit"
desc = "An active gibtonite reserve. Run!"
stage = 1
stage = GIBTONITE_ACTIVE
visible_message("<span class='danger'>There was gibtonite inside! It's going to explode!</span>")
var/turf/bombturf = get_turf(src)
var/area/A = get_area(bombturf)
@@ -481,39 +452,39 @@
/turf/simulated/mineral/gibtonite/proc/countdown(notify_admins = 0)
set waitfor = 0
while(istype(src, /turf/simulated/mineral/gibtonite) && stage == 1 && det_time > 0 && mineralAmt >= 1)
while(istype(src, /turf/simulated/mineral/gibtonite) && stage == GIBTONITE_ACTIVE && det_time > 0 && mineralAmt >= 1)
det_time--
sleep(5)
if(istype(src, /turf/simulated/mineral/gibtonite))
if(stage == 1 && det_time <= 0 && mineralAmt >= 1)
if(stage == GIBTONITE_ACTIVE && det_time <= 0 && mineralAmt >= 1)
var/turf/bombturf = get_turf(src)
mineralAmt = 0
stage = 3
stage = GIBTONITE_DETONATE
explosion(bombturf,1,3,5, adminlog = notify_admins)
/turf/simulated/mineral/gibtonite/proc/defuse()
if(stage == 1)
overlays -= activated_image
var/image/I = image('icons/turf/smoothrocks.dmi', loc = src, icon_state = "rock_Gibtonite_inactive", layer = ON_EDGED_TURF_LAYER)
add_overlay(I)
if(stage == GIBTONITE_ACTIVE)
cut_overlay(activated_overlay)
activated_overlay.icon_state = "rock_Gibtonite_inactive"
add_overlay(activated_overlay)
desc = "An inactive gibtonite reserve. The ore can be extracted."
stage = 2
stage = GIBTONITE_STABLE
if(det_time < 0)
det_time = 0
visible_message("<span class='notice'>The chain reaction was stopped! The gibtonite had [src.det_time] reactions left till the explosion!</span>")
visible_message("<span class='notice'>The chain reaction was stopped! The gibtonite had [det_time] reactions left till the explosion!</span>")
/turf/simulated/mineral/gibtonite/gets_drilled(var/mob/user, triggered_by_explosion = 0)
if(stage == 0 && mineralAmt >= 1) //Gibtonite deposit is activated
playsound(src, 'sound/effects/hit_on_shattered_glass.ogg',50,1)
if(stage == GIBTONITE_UNSTRUCK && mineralAmt >= 1) //Gibtonite deposit is activated
playsound(src,'sound/effects/hit_on_shattered_glass.ogg', 50, TRUE)
explosive_reaction(user, triggered_by_explosion)
return
if(stage == 1 && mineralAmt >= 1) //Gibtonite deposit goes kaboom
if(stage == GIBTONITE_ACTIVE && mineralAmt >= 1) //Gibtonite deposit goes kaboom
var/turf/bombturf = get_turf(src)
mineralAmt = 0
stage = 3
explosion(bombturf, 1, 2, 5, adminlog = 0)
if(stage == 2) //Gibtonite deposit is now benign and extractable. Depending on how close you were to it blowing up before defusing, you get better quality ore.
var/obj/item/twohanded/required/gibtonite/G = new /obj/item/twohanded/required/gibtonite/(src)
stage = GIBTONITE_DETONATE
explosion(bombturf,1,2,5, adminlog = 0)
if(stage == GIBTONITE_STABLE) //Gibtonite deposit is now benign and extractable. Depending on how close you were to it blowing up before defusing, you get better quality ore.
var/obj/item/twohanded/required/gibtonite/G = new(src)
if(det_time <= 0)
G.quality = 3
G.icon_state = "Gibtonite ore 3"
@@ -523,3 +494,18 @@
ChangeTurf(turf_type, defer_change)
addtimer(CALLBACK(src, .proc/AfterChange), 1, TIMER_UNIQUE)
/turf/simulated/mineral/gibtonite/volcanic
environment_type = "basalt"
turf_type = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface
baseturf = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface
oxygen = 14
nitrogen = 23
temperature = 300
defer_change = 1
#undef GIBTONITE_UNSTRUCK
#undef GIBTONITE_ACTIVE
#undef GIBTONITE_STABLE
#undef GIBTONITE_DETONATE
+1 -1
View File
@@ -4,7 +4,7 @@
#define RANDOM_LOWER_X 50
#define RANDOM_LOWER_Y 50
/proc/spawn_rivers(target_z, nodes = 4, turf_type = /turf/simulated/floor/plating/lava/smooth/lava_land_surface, whitelist_area = /area/lavaland/surface/outdoors/unexplored, min_x = RANDOM_LOWER_X, min_y = RANDOM_LOWER_Y, max_x = RANDOM_UPPER_X, max_y = RANDOM_UPPER_Y)
/proc/spawn_rivers(target_z, nodes = 4, turf_type = /turf/simulated/floor/plating/lava/smooth/lava_land_surface, whitelist_area = /area/lavaland/surface/outdoors, min_x = RANDOM_LOWER_X, min_y = RANDOM_LOWER_Y, max_x = RANDOM_UPPER_X, max_y = RANDOM_UPPER_Y)
var/list/river_nodes = list()
var/num_spawned = 0
var/list/possible_locs = block(locate(min_x, min_y, target_z), locate(max_x, max_y, target_z))
@@ -79,7 +79,7 @@
holds_charge = TRUE
unique_frequency = TRUE
/obj/item/gun/energy/kinetic_accelerator/New()
/obj/item/gun/energy/kinetic_accelerator/Initialize(mapload)
. = ..()
if(!holds_charge)
empty()
@@ -98,8 +98,7 @@
if(!QDELING(src) && !holds_charge)
// Put it on a delay because moving item from slot to hand
// calls dropped().
spawn(2)
empty_if_not_held()
addtimer(CALLBACK(src, .proc/empty_if_not_held), 2)
/obj/item/gun/energy/kinetic_accelerator/proc/empty_if_not_held()
if(!ismob(loc))
@@ -143,17 +142,17 @@
overheat = FALSE
/obj/item/gun/energy/kinetic_accelerator/update_icon()
overlays.Cut()
cut_overlays()
if(empty_state && !can_shoot())
overlays += empty_state
add_overlay(empty_state)
if(gun_light && can_flashlight)
var/iconF = "flight"
if(gun_light.on)
iconF = "flight_on"
overlays += image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset)
add_overlay(image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset))
if(bayonet && can_bayonet)
overlays += knife_overlay
add_overlay(knife_overlay)
/obj/item/gun/energy/kinetic_accelerator/experimental
+1
View File
@@ -89,6 +89,7 @@
#include "code\__HELPERS\text.dm"
#include "code\__HELPERS\time.dm"
#include "code\__HELPERS\type2type.dm"
#include "code\__HELPERS\typelists.dm"
#include "code\__HELPERS\unique_ids.dm"
#include "code\__HELPERS\unsorted.dm"
#include "code\__HELPERS\sorts\__main.dm"