* ports all the tg junk for icemoon, not yet changed to make it all compile * fixes * fixes * fixes * fixes * fixes * new stuff * whew * fixes * it compiles, now to fix the maps * fixes the maps * fixes solars + removes the space tiles in the toxins burn chamber * nukes the SpawnTerrain proc used for tg geysers * linter fix * fix * fixes the non matching turf atmos (hopefully) * more mapping fixes * dmm2tgm * unfucks changeturf for the more_caves * fixes the volanic subtypes of the other thing * fixes the stupid fucking tile placing list * some map fixes, fixes the station_ruin loader shitting out errors this commit took 2 hours of my fucking life * fixes a bunch of mismatch atmos in ruins * fixes wendigo cave having no air * backwards couch backwards couch * fixes the SM up * wendigos can't runtime when butchering if you can't butcher them 😎 * makes the wendigo fight have the same atmos as the surrounding icemoon * Tweaks atmos mixture from o2=22;n2=82;TEMP=180 to o2=18;n2=63;TEMP=180, making lavaland weapons actually work * makes the wendigo screech shake not completely aids * fixes snowlegion portals dropping proper legions instead of skeles * brings the engioutpost ruin over as well * whoopps * empty commit to reroll bots * Fixes pirates, ops, the mining base, and gives pirates and ops drills * fixes lone ops and ninjas * fixes the snowed plating getting fucked when tiles are placed on it * removes some OP junk from the wabbajack pool (aka removes non-antag headslugs again) * more bug fixes * empty commit to reroll bots * hopefully finally kills the active turfs on the library ruin Co-authored-by: kevinz000 <2003111+kevinz000@users.noreply.github.com>
This commit is contained in:
@@ -313,6 +313,11 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player)
|
||||
name = "carpspawn"
|
||||
icon_state = "carp_spawn"
|
||||
|
||||
// lone op (optional)
|
||||
/obj/effect/landmark/loneopspawn
|
||||
name = "loneop+ninjaspawn"
|
||||
icon_state = "snukeop_spawn"
|
||||
|
||||
// observer-start.
|
||||
/obj/effect/landmark/observer_start
|
||||
name = "Observer-Start"
|
||||
@@ -512,3 +517,9 @@ INITIALIZE_IMMEDIATE(/obj/effect/landmark/start/new_player)
|
||||
/obj/effect/landmark/stationroom/lavaland/station
|
||||
templates = list("Public Mining Base" = 3)
|
||||
icon = 'icons/rooms/Lavaland/Mining.dmi'
|
||||
|
||||
// handled in portals.dm, id connected to one-way portal
|
||||
/obj/effect/landmark/portal_exit
|
||||
name = "portal exit"
|
||||
icon_state = "portal_exit"
|
||||
var/id
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
var/allow_anchored = FALSE
|
||||
var/innate_accuracy_penalty = 0
|
||||
var/last_effect = 0
|
||||
var/force_teleport = FALSE
|
||||
|
||||
/obj/effect/portal/anom
|
||||
name = "wormhole"
|
||||
@@ -162,7 +163,7 @@
|
||||
no_effect = TRUE
|
||||
else
|
||||
last_effect = world.time
|
||||
if(do_teleport(M, real_target, innate_accuracy_penalty, no_effects = no_effect, channel = teleport_channel))
|
||||
if(do_teleport(M, real_target, innate_accuracy_penalty, no_effects = no_effect, channel = teleport_channel, forced = force_teleport))
|
||||
if(istype(M, /obj/item/projectile))
|
||||
var/obj/item/projectile/P = M
|
||||
P.ignore_source_check = TRUE
|
||||
@@ -183,3 +184,47 @@
|
||||
else
|
||||
real_target = get_turf(linked)
|
||||
return real_target
|
||||
|
||||
/obj/effect/portal/permanent
|
||||
name = "permanent portal"
|
||||
desc = "An unwavering portal that will never fade."
|
||||
hardlinked = FALSE // dont qdel my portal nerd
|
||||
force_teleport = TRUE // force teleports because they're a mapmaker tool
|
||||
var/id // var edit or set id in map editor
|
||||
|
||||
/obj/effect/portal/permanent/proc/set_linked()
|
||||
if(!id)
|
||||
return
|
||||
for(var/obj/effect/portal/permanent/P in GLOB.portals - src)
|
||||
if(P.id == id)
|
||||
P.linked = src
|
||||
linked = P
|
||||
break
|
||||
|
||||
/obj/effect/portal/permanent/teleport(atom/movable/M, force = FALSE)
|
||||
set_linked() // update portal links
|
||||
. = ..()
|
||||
|
||||
/obj/effect/portal/permanent/one_way // doesn't have a return portal, can have multiple exits, /obj/effect/landmark/portal_exit to mark them
|
||||
name = "one-way portal"
|
||||
desc = "You get the feeling that this might not be the safest thing you've ever done."
|
||||
|
||||
/obj/effect/portal/permanent/one_way/set_linked()
|
||||
if(!id)
|
||||
return
|
||||
var/list/possible_turfs = list()
|
||||
for(var/obj/effect/landmark/portal_exit/PE in GLOB.landmarks_list)
|
||||
if(PE.id == id)
|
||||
var/turf/T = get_turf(PE)
|
||||
if(T)
|
||||
possible_turfs |= T
|
||||
if(possible_turfs.len)
|
||||
hard_target = pick(possible_turfs)
|
||||
|
||||
/obj/effect/portal/permanent/one_way/one_use
|
||||
name = "one-use portal"
|
||||
desc = "This is probably the worst decision you'll ever make in your life."
|
||||
|
||||
/obj/effect/portal/permanent/one_way/one_use/teleport(atom/movable/M, force = FALSE)
|
||||
. = ..()
|
||||
qdel(src)
|
||||
|
||||
@@ -351,6 +351,12 @@
|
||||
light_color = "#FFAA44"
|
||||
flashlight_power = 0.8
|
||||
|
||||
/obj/item/flashlight/lantern/jade
|
||||
name = "jade lantern"
|
||||
desc = "An ornate, green lantern."
|
||||
color = LIGHT_COLOR_GREEN
|
||||
light_color = LIGHT_COLOR_GREEN
|
||||
|
||||
/obj/item/flashlight/slime
|
||||
gender = PLURAL
|
||||
name = "glowing slime extract"
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
level = 1
|
||||
var/trigger_mob = TRUE
|
||||
var/trigger_item = FALSE
|
||||
var/specific_item = null
|
||||
var/trigger_silent = FALSE
|
||||
var/sound/trigger_sound = 'sound/effects/pressureplate.ogg'
|
||||
var/obj/item/assembly/signaler/sigdev = null
|
||||
@@ -35,6 +36,8 @@
|
||||
. = ..()
|
||||
if(!can_trigger || !active)
|
||||
return
|
||||
if(trigger_item && !istype(AM, specific_item))
|
||||
return
|
||||
if(trigger_mob && isliving(AM))
|
||||
var/mob/living/L = AM
|
||||
to_chat(L, "<span class='warning'>You feel something click beneath you!</span>")
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
* Fork
|
||||
* Kitchen knives
|
||||
* Ritual Knife
|
||||
* Bloodletter
|
||||
* Butcher's cleaver
|
||||
* Combat Knife
|
||||
* Rolling Pins
|
||||
@@ -97,6 +98,28 @@
|
||||
righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
|
||||
/obj/item/kitchen/knife/bloodletter
|
||||
name = "bloodletter"
|
||||
desc = "An occult looking dagger that is cold to the touch. Somehow, the flawless orb on the pommel is made entirely of liquid blood."
|
||||
icon = 'icons/obj/ice_moon/artifacts.dmi'
|
||||
icon_state = "bloodletter"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
/// Bleed stacks applied when an organic mob target is hit
|
||||
var/bleed_stacks_per_hit = 3
|
||||
|
||||
/obj/item/kitchen/knife/bloodletter/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
|
||||
. = ..()
|
||||
if(!isliving(target) || !proximity_flag)
|
||||
return
|
||||
var/mob/living/M = target
|
||||
if(!(M.mob_biotypes & MOB_ORGANIC))
|
||||
return
|
||||
var/datum/status_effect/stacking/saw_bleed/bloodletting/B = M.has_status_effect(/datum/status_effect/stacking/saw_bleed/bloodletting)
|
||||
if(!B)
|
||||
M.apply_status_effect(/datum/status_effect/stacking/saw_bleed/bloodletting, bleed_stacks_per_hit)
|
||||
else
|
||||
B.add_stacks(bleed_stacks_per_hit)
|
||||
|
||||
/obj/item/kitchen/knife/butcher
|
||||
name = "butcher's cleaver"
|
||||
icon_state = "butch"
|
||||
|
||||
146
code/game/objects/items/puzzle_pieces.dm
Normal file
146
code/game/objects/items/puzzle_pieces.dm
Normal file
@@ -0,0 +1,146 @@
|
||||
//**************
|
||||
//*****Keys*******************
|
||||
//************** ** **
|
||||
/obj/item/keycard
|
||||
name = "security keycard"
|
||||
desc = "This feels like it belongs to a door."
|
||||
icon = 'icons/obj/puzzle_small.dmi'
|
||||
icon_state = "keycard"
|
||||
force = 0
|
||||
throwforce = 0
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
throw_speed = 1
|
||||
throw_range = 7
|
||||
resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF
|
||||
var/puzzle_id = null
|
||||
|
||||
//Two test keys for use alongside the two test doors.
|
||||
/obj/item/keycard/cheese
|
||||
name = "cheese keycard"
|
||||
desc = "Look, I still don't understand the reference. What the heck is a keyzza?"
|
||||
color = "#f0da12"
|
||||
puzzle_id = "cheese"
|
||||
|
||||
/obj/item/keycard/swordfish
|
||||
name = "titanic keycard"
|
||||
desc = "Smells like it was at the bottom of a harbor."
|
||||
color = "#3bbbdb"
|
||||
puzzle_id = "swordfish"
|
||||
|
||||
//***************
|
||||
//*****Doors*****
|
||||
//***************
|
||||
|
||||
/obj/machinery/door/keycard
|
||||
name = "locked door"
|
||||
desc = "This door only opens when a keycard is swiped. It looks virtually indestructable."
|
||||
icon = 'icons/obj/doors/puzzledoor/default.dmi'
|
||||
icon_state = "door_closed"
|
||||
explosion_block = 3
|
||||
heat_proof = TRUE
|
||||
max_integrity = 600
|
||||
armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
|
||||
resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF
|
||||
damage_deflection = 70
|
||||
/// Make sure that the key has the same puzzle_id as the keycard door!
|
||||
var/puzzle_id = null
|
||||
/// Message that occurs when the door is opened
|
||||
var/open_message = "The door beeps, and slides opens."
|
||||
|
||||
//Standard Expressions to make keycard doors basically un-cheeseable
|
||||
/obj/machinery/door/keycard/Bumped(atom/movable/AM)
|
||||
return !density && ..()
|
||||
|
||||
/obj/machinery/door/keycard/emp_act(severity)
|
||||
return
|
||||
|
||||
/obj/machinery/door/keycard/ex_act(severity, target)
|
||||
return
|
||||
|
||||
/obj/machinery/door/keycard/try_to_activate_door(mob/user)
|
||||
add_fingerprint(user)
|
||||
if(operating)
|
||||
return
|
||||
|
||||
/obj/machinery/door/keycard/attackby(obj/item/I, mob/user, params)
|
||||
. = ..()
|
||||
if(istype(I,/obj/item/keycard))
|
||||
var/obj/item/keycard/key = I
|
||||
if((!puzzle_id || puzzle_id == key.puzzle_id) && density)
|
||||
if(open_message)
|
||||
to_chat(user, "<span class='notice'>[open_message]</span>")
|
||||
open()
|
||||
return
|
||||
else if(puzzle_id != key.puzzle_id)
|
||||
to_chat(user, "<span class='notice'>[src] buzzes. This must not be the right key.</span>")
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='notice'>This door doesn't appear to close.</span>")
|
||||
return
|
||||
|
||||
//Test doors. Gives admins a few doors to use quickly should they so choose.
|
||||
/obj/machinery/door/keycard/cheese
|
||||
name = "blue airlock"
|
||||
desc = "Smells like... pizza?"
|
||||
puzzle_id = "cheese"
|
||||
|
||||
/obj/machinery/door/keycard/swordfish
|
||||
name = "blue airlock"
|
||||
desc = "If nautical nonsense be something you wish."
|
||||
puzzle_id = "swordfish"
|
||||
|
||||
//*************************
|
||||
//***Box Pushing Puzzles***
|
||||
//*************************
|
||||
//We're working off a subtype of pressureplates, which should work just a BIT better now.
|
||||
/obj/structure/holobox
|
||||
name = "holobox"
|
||||
desc = "A hard-light box, containing a secure decryption key."
|
||||
icon = 'icons/obj/puzzle_small.dmi'
|
||||
icon_state = "laserbox"
|
||||
density = TRUE
|
||||
resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF
|
||||
|
||||
//Uses the pressure_plate settings for a pretty basic custom pattern that waits for a specific item to trigger. Easy enough to retool for mapping purposes or subtypes.
|
||||
/obj/item/pressure_plate/hologrid
|
||||
name = "hologrid"
|
||||
desc = "A high power, electronic input port for a holobox, which can unlock the hologrid's storage compartment. Safe to stand on."
|
||||
icon = 'icons/obj/puzzle_small.dmi'
|
||||
icon_state = "lasergrid"
|
||||
anchored = TRUE
|
||||
trigger_mob = FALSE
|
||||
trigger_item = TRUE
|
||||
specific_item = /obj/structure/holobox
|
||||
removable_signaller = FALSE //Being a pressure plate subtype, this can also use signals.
|
||||
roundstart_signaller_freq = FREQ_HOLOGRID_SOLUTION //Frequency is kept on it's own default channel however.
|
||||
active = TRUE
|
||||
trigger_delay = 10
|
||||
resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF
|
||||
var/reward = /obj/item/reagent_containers/food/snacks/cookie
|
||||
var/claimed = FALSE
|
||||
|
||||
/obj/item/pressure_plate/hologrid/examine(mob/user)
|
||||
. = ..()
|
||||
if(claimed)
|
||||
. += "<span class='notice'>This one appears to be spent already.</span>"
|
||||
|
||||
/obj/item/pressure_plate/hologrid/trigger()
|
||||
if(!claimed)
|
||||
new reward(loc)
|
||||
flick("lasergrid_a",src)
|
||||
icon_state = "lasergrid_full"
|
||||
claimed = TRUE
|
||||
|
||||
/obj/item/pressure_plate/hologrid/Crossed(atom/movable/AM)
|
||||
. = ..()
|
||||
if(trigger_item && istype(AM, specific_item) && !claimed)
|
||||
AM.anchored = TRUE
|
||||
flick("laserbox_burn", AM)
|
||||
trigger()
|
||||
sleep(15)
|
||||
qdel(AM)
|
||||
|
||||
// snowflake code until undertile elements
|
||||
/obj/item/pressure_plate/hologrid/hide()
|
||||
. = ..()
|
||||
anchored = TRUE
|
||||
@@ -178,6 +178,11 @@ GLOBAL_LIST_INIT(leather_recipes, list ( \
|
||||
icon_state = "sinew"
|
||||
novariants = TRUE
|
||||
|
||||
/obj/item/stack/sheet/sinew/wolf
|
||||
name = "wolf sinew"
|
||||
desc = "Long stringy filaments which came from the insides of a wolf."
|
||||
singular_name = "wolf sinew"
|
||||
|
||||
|
||||
GLOBAL_LIST_INIT(sinew_recipes, list ( \
|
||||
new/datum/stack_recipe("sinew restraints", /obj/item/restraints/handcuffs/sinew, 1), \
|
||||
@@ -202,6 +207,11 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
layer = MOB_LAYER
|
||||
|
||||
/obj/item/stack/sheet/animalhide/goliath_hide/polar_bear_hide
|
||||
name = "polar bear hides"
|
||||
desc = "Pieces of a polar bear's fur, these might be able to make your suit a bit more durable to attack from the local fauna."
|
||||
icon_state = "polar_bear_hide"
|
||||
singular_name = "polar bear hide"
|
||||
|
||||
/obj/item/stack/sheet/animalhide/ashdrake
|
||||
name = "ash drake hide"
|
||||
|
||||
@@ -350,11 +350,28 @@
|
||||
icon = 'icons/obj/flora/rocks.dmi'
|
||||
resistance_flags = FIRE_PROOF
|
||||
density = TRUE
|
||||
/// Itemstack that is dropped when a rock is mined with a pickaxe
|
||||
var/obj/item/stack/mineResult = /obj/item/stack/ore/glass/basalt
|
||||
/// Amount of the itemstack to drop
|
||||
var/mineAmount = 20
|
||||
|
||||
/obj/structure/flora/rock/Initialize()
|
||||
. = ..()
|
||||
icon_state = "[icon_state][rand(1,3)]"
|
||||
|
||||
/obj/structure/flora/rock/attackby(obj/item/W, mob/user, params)
|
||||
if(!mineResult || W.tool_behaviour != TOOL_MINING)
|
||||
return ..()
|
||||
if(flags_1 & NODECONSTRUCT_1)
|
||||
return ..()
|
||||
to_chat(user, "<span class='notice'>You start mining...</span>")
|
||||
if(W.use_tool(src, user, 40, volume=50))
|
||||
to_chat(user, "<span class='notice'>You finish mining the rock.</span>")
|
||||
if(mineResult && mineAmount)
|
||||
new mineResult(get_turf(src), mineAmount)
|
||||
SSblackbox.record_feedback("tally", "pick_used_mining", 1, W.type)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/flora/rock/pile
|
||||
icon_state = "lavarocks"
|
||||
desc = "A pile of rocks."
|
||||
|
||||
178
code/game/objects/structures/icemoon/cave_entrance.dm
Normal file
178
code/game/objects/structures/icemoon/cave_entrance.dm
Normal file
@@ -0,0 +1,178 @@
|
||||
GLOBAL_LIST_INIT(ore_probability, list(/obj/item/stack/ore/uranium = 50,
|
||||
/obj/item/stack/ore/iron = 100,
|
||||
/obj/item/stack/ore/plasma = 75,
|
||||
/obj/item/stack/ore/silver = 50,
|
||||
/obj/item/stack/ore/gold = 50,
|
||||
/obj/item/stack/ore/diamond = 25,
|
||||
/obj/item/stack/ore/bananium = 5,
|
||||
/obj/item/stack/ore/titanium = 75))
|
||||
|
||||
/obj/structure/spawner/ice_moon
|
||||
name = "cave entrance"
|
||||
desc = "A hole in the ground, filled with monsters ready to defend it."
|
||||
icon = 'icons/mob/nest.dmi'
|
||||
icon_state = "hole"
|
||||
faction = list("mining")
|
||||
max_mobs = 3
|
||||
max_integrity = 250
|
||||
mob_types = list(/mob/living/simple_animal/hostile/asteroid/wolf)
|
||||
move_resist = INFINITY
|
||||
anchored = TRUE
|
||||
|
||||
/obj/structure/spawner/ice_moon/Initialize()
|
||||
. = ..()
|
||||
clear_rock()
|
||||
|
||||
/**
|
||||
* Clears rocks around the spawner when it is created
|
||||
*
|
||||
*/
|
||||
/obj/structure/spawner/ice_moon/proc/clear_rock()
|
||||
for(var/turf/F in RANGE_TURFS(2, src))
|
||||
if(abs(src.x - F.x) + abs(src.y - F.y) > 3)
|
||||
continue
|
||||
if(ismineralturf(F))
|
||||
var/turf/closed/mineral/M = F
|
||||
M.ScrapeAway(null, CHANGETURF_IGNORE_AIR)
|
||||
|
||||
/obj/structure/spawner/ice_moon/deconstruct(disassembled)
|
||||
destroy_effect()
|
||||
drop_loot()
|
||||
return ..()
|
||||
|
||||
/**
|
||||
* Effects and messages created when the spawner is destroyed
|
||||
*
|
||||
*/
|
||||
/obj/structure/spawner/ice_moon/proc/destroy_effect()
|
||||
playsound(loc,'sound/effects/explosionfar.ogg', 200, TRUE)
|
||||
visible_message("<span class='boldannounce'>[src] collapses, sealing everything inside!</span>\n<span class='warning'>Ores fall out of the cave as it is destroyed!</span>")
|
||||
|
||||
/**
|
||||
* Drops items after the spawner is destroyed
|
||||
*
|
||||
*/
|
||||
/obj/structure/spawner/ice_moon/proc/drop_loot()
|
||||
for(var/type in GLOB.ore_probability)
|
||||
var/chance = GLOB.ore_probability[type]
|
||||
if(!prob(chance))
|
||||
continue
|
||||
new type(loc, rand(5, 10))
|
||||
|
||||
/obj/structure/spawner/ice_moon/polarbear
|
||||
max_mobs = 1
|
||||
spawn_time = 60 SECONDS
|
||||
mob_types = list(/mob/living/simple_animal/hostile/asteroid/polarbear)
|
||||
|
||||
/obj/structure/spawner/ice_moon/polarbear/clear_rock()
|
||||
for(var/turf/F in RANGE_TURFS(1, src))
|
||||
if(ismineralturf(F))
|
||||
var/turf/closed/mineral/M = F
|
||||
M.ScrapeAway(null, CHANGETURF_IGNORE_AIR)
|
||||
|
||||
/obj/structure/spawner/ice_moon/demonic_portal
|
||||
name = "demonic portal"
|
||||
desc = "A portal that goes to another world, normal creatures couldn't survive there."
|
||||
icon_state = "nether"
|
||||
mob_types = list(/mob/living/simple_animal/hostile/asteroid/ice_demon)
|
||||
light_range = 1
|
||||
light_color = LIGHT_COLOR_RED
|
||||
|
||||
/obj/structure/spawner/ice_moon/demonic_portal/clear_rock()
|
||||
for(var/turf/F in RANGE_TURFS(3, src))
|
||||
if(abs(src.x - F.x) + abs(src.y - F.y) > 5)
|
||||
continue
|
||||
if(ismineralturf(F))
|
||||
var/turf/closed/mineral/M = F
|
||||
M.ScrapeAway(null, CHANGETURF_IGNORE_AIR)
|
||||
|
||||
/obj/structure/spawner/ice_moon/demonic_portal/destroy_effect()
|
||||
new /obj/effect/collapsing_demonic_portal(loc)
|
||||
|
||||
/obj/structure/spawner/ice_moon/demonic_portal/drop_loot()
|
||||
return
|
||||
|
||||
/obj/structure/spawner/ice_moon/demonic_portal/ice_whelp
|
||||
mob_types = list(/mob/living/simple_animal/hostile/asteroid/ice_whelp)
|
||||
|
||||
/obj/structure/spawner/ice_moon/demonic_portal/snowlegion
|
||||
mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow/tendril)
|
||||
|
||||
/obj/effect/collapsing_demonic_portal
|
||||
name = "collapsing demonic portal"
|
||||
desc = "It's slowly fading!"
|
||||
layer = TABLE_LAYER
|
||||
icon = 'icons/mob/nest.dmi'
|
||||
icon_state = "nether"
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
|
||||
/obj/effect/collapsing_demonic_portal/Initialize()
|
||||
. = ..()
|
||||
playsound(loc,'sound/effects/tendril_destroyed.ogg', 200, FALSE, 50, TRUE, TRUE)
|
||||
visible_message("<span class='boldannounce'>[src] begins to collapse, cutting it off from this world!</span>")
|
||||
animate(src, transform = matrix().Scale(0, 1), alpha = 50, time = 5 SECONDS)
|
||||
addtimer(CALLBACK(src, .proc/collapse), 5 SECONDS)
|
||||
|
||||
/obj/effect/collapsing_demonic_portal/proc/collapse()
|
||||
visible_message("<span class='warning'>Something slips out of [src]!</span>")
|
||||
var/loot = rand(1, 28)
|
||||
switch(loot)
|
||||
if(1)
|
||||
new /obj/item/clothing/suit/space/hardsuit/cult(loc)
|
||||
if(2)
|
||||
new /obj/item/clothing/glasses/godeye(loc)
|
||||
if(3)
|
||||
new /obj/item/reagent_containers/glass/bottle/potion/flight(loc)
|
||||
if(4)
|
||||
new /obj/item/organ/heart/cursed/wizard(loc)
|
||||
if(5)
|
||||
new /obj/item/jacobs_ladder(loc)
|
||||
if(6)
|
||||
new /obj/item/rod_of_asclepius(loc)
|
||||
if(7)
|
||||
new /obj/item/warp_cube/red(loc)
|
||||
if(8)
|
||||
new /obj/item/wisp_lantern(loc)
|
||||
if(9)
|
||||
new /obj/item/immortality_talisman(loc)
|
||||
if(10)
|
||||
new /obj/item/book/granter/spell/summonitem(loc)
|
||||
if(11)
|
||||
new /obj/item/clothing/neck/necklace/memento_mori(loc)
|
||||
if(12)
|
||||
new /obj/item/borg/upgrade/modkit/lifesteal(loc)
|
||||
new /obj/item/bedsheet/cult(loc)
|
||||
if(13)
|
||||
new /obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe(loc)
|
||||
if(14)
|
||||
new /obj/item/disk/design_disk/modkit_disc/bounty(loc)
|
||||
if(15)
|
||||
new /obj/item/ship_in_a_bottle(loc)
|
||||
new /obj/item/oar(loc)
|
||||
if(16)
|
||||
new /obj/item/seeds/gatfruit(loc)
|
||||
if(17)
|
||||
new /obj/item/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola(loc)
|
||||
if(18)
|
||||
new /obj/item/assembly/signaler/anomaly/bluespace(loc)
|
||||
if(19)
|
||||
new /obj/item/disk/design_disk/modkit_disc/resonator_blast(loc)
|
||||
if(20)
|
||||
new /obj/item/disk/design_disk/modkit_disc/rapid_repeater(loc)
|
||||
if(21)
|
||||
new /obj/item/slimepotion/transference(loc)
|
||||
if(22)
|
||||
new /obj/item/slime_extract/adamantine(loc)
|
||||
if(23)
|
||||
new /obj/item/weldingtool/abductor(loc)
|
||||
if(24)
|
||||
new /obj/structure/elite_tumor(loc)
|
||||
if(25)
|
||||
new /mob/living/simple_animal/hostile/retaliate/clown/clownhulk(loc)
|
||||
if(26)
|
||||
new /obj/item/clothing/shoes/winterboots/ice_boots(loc)
|
||||
if(27)
|
||||
new /obj/item/book/granter/spell/sacredflame(loc)
|
||||
if(28)
|
||||
new /mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/doom(loc)
|
||||
86
code/game/objects/structures/lavaland/geyser.dm
Normal file
86
code/game/objects/structures/lavaland/geyser.dm
Normal file
@@ -0,0 +1,86 @@
|
||||
//If you look at the "geyser_soup" overlay icon_state, you'll see that the first frame has 25 ticks.
|
||||
//That's because the first 18~ ticks are completely skipped for some ungodly weird fucking byond reason
|
||||
|
||||
/obj/structure/geyser
|
||||
name = "geyser"
|
||||
icon = 'icons/obj/lavaland/terrain.dmi'
|
||||
icon_state = "geyser"
|
||||
anchored = TRUE
|
||||
|
||||
var/erupting_state = null //set to null to get it greyscaled from "[icon_state]_soup". Not very usable with the whole random thing, but more types can be added if you change the spawn prob
|
||||
var/activated = FALSE //whether we are active and generating chems
|
||||
var/reagent_id = /datum/reagent/fuel/oil
|
||||
var/potency = 2 //how much reagents we add every process (2 seconds)
|
||||
var/max_volume = 500
|
||||
var/start_volume = 50
|
||||
|
||||
/obj/structure/geyser/proc/start_chemming()
|
||||
activated = TRUE
|
||||
create_reagents(max_volume, DRAINABLE)
|
||||
reagents.add_reagent(reagent_id, start_volume)
|
||||
START_PROCESSING(SSfluids, src) //It's main function is to be plumbed, so use SSfluids
|
||||
if(erupting_state)
|
||||
icon_state = erupting_state
|
||||
else
|
||||
var/mutable_appearance/I = mutable_appearance('icons/obj/lavaland/terrain.dmi', "[icon_state]_soup")
|
||||
I.color = mix_color_from_reagents(reagents.reagent_list)
|
||||
add_overlay(I)
|
||||
|
||||
/obj/structure/geyser/process()
|
||||
if(activated && reagents.total_volume <= reagents.maximum_volume) //this is also evaluated in add_reagent, but from my understanding proc calls are expensive
|
||||
reagents.add_reagent(reagent_id, potency)
|
||||
|
||||
/obj/structure/geyser/plunger_act(obj/item/plunger/P, mob/living/user, _reinforced)
|
||||
if(!_reinforced)
|
||||
to_chat(user, "<span class='warning'>The [P.name] isn't strong enough!</span>")
|
||||
return
|
||||
if(activated)
|
||||
to_chat(user, "<span class'warning'>The [name] is already active!</span>")
|
||||
return
|
||||
|
||||
to_chat(user, "<span class='notice'>You start vigorously plunging [src]!</span>")
|
||||
if(do_after(user, 50 * P.plunge_mod, target = src) && !activated)
|
||||
start_chemming()
|
||||
|
||||
/obj/structure/geyser/random
|
||||
erupting_state = null
|
||||
var/list/options = list(/datum/reagent/clf3 = 10, /datum/reagent/water/hollowwater = 10, /datum/reagent/medicine/omnizine/protozine = 6, /datum/reagent/wittel = 1)
|
||||
|
||||
/obj/structure/geyser/random/Initialize()
|
||||
. = ..()
|
||||
reagent_id = pickweight(options)
|
||||
|
||||
/obj/item/plunger
|
||||
name = "plunger"
|
||||
desc = "It's a plunger for plunging."
|
||||
icon = 'icons/obj/watercloset.dmi'
|
||||
icon_state = "plunger"
|
||||
|
||||
slot_flags = ITEM_SLOT_MASK
|
||||
|
||||
var/plunge_mod = 1 //time*plunge_mod = total time we take to plunge an object
|
||||
var/reinforced = FALSE //whether we do heavy duty stuff like geysers
|
||||
|
||||
/obj/item/plunger/attack_obj(obj/O, mob/living/user)
|
||||
if(!O.plunger_act(src, user, reinforced))
|
||||
return ..()
|
||||
|
||||
/obj/item/plunger/throw_impact(atom/hit_atom, datum/thrownthing/tt)
|
||||
. = ..()
|
||||
if(tt.target_zone != BODY_ZONE_HEAD)
|
||||
return
|
||||
if(iscarbon(hit_atom))
|
||||
var/mob/living/carbon/H = hit_atom
|
||||
if(!H.wear_mask)
|
||||
H.equip_to_slot_if_possible(src, ITEM_SLOT_MASK)
|
||||
H.visible_message("<span class='warning'>The plunger slams into [H]'s face!</span>", "<span class='warning'>The plunger suctions to your face!</span>")
|
||||
|
||||
/obj/item/plunger/reinforced
|
||||
name = "reinforced plunger"
|
||||
desc = "It's an M. 7 Reinforced Plunger© for heavy duty plunging."
|
||||
icon_state = "reinforced_plunger"
|
||||
|
||||
reinforced = TRUE
|
||||
plunge_mod = 0.8
|
||||
|
||||
custom_premium_price = 1200
|
||||
@@ -25,6 +25,9 @@
|
||||
/obj/structure/spawner/lavaland/legion
|
||||
mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril)
|
||||
|
||||
/obj/structure/spawner/lavaland/icewatcher
|
||||
mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing)
|
||||
|
||||
GLOBAL_LIST_INIT(tendrils, list())
|
||||
/obj/structure/spawner/lavaland/Initialize()
|
||||
. = ..()
|
||||
@@ -94,4 +97,4 @@ GLOBAL_LIST_INIT(tendrils, list())
|
||||
for(var/turf/T in range(2,src))
|
||||
if(!T.density)
|
||||
T.TerraformTurf(/turf/open/chasm/lavaland, /turf/open/chasm/lavaland, flags = CHANGETURF_INHERIT_AIR)
|
||||
qdel(src)
|
||||
qdel(src)
|
||||
|
||||
Reference in New Issue
Block a user