mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-13 08:03:43 +01:00
Port over remaining Lavaland ruins
This commit is contained in:
@@ -432,6 +432,8 @@
|
||||
l_pocket = /obj/item/reagent_containers/food/pill/patch/styptic
|
||||
r_pocket = /obj/item/flashlight/seclite
|
||||
|
||||
/obj/effect/mob_spawn/human/miner/explorer
|
||||
outfit = /datum/outfit/job/mining/equipped
|
||||
|
||||
/obj/effect/mob_spawn/human/bartender
|
||||
name = "Space Bartender"
|
||||
|
||||
@@ -36,9 +36,220 @@
|
||||
if(prob(1))
|
||||
mezzer()
|
||||
|
||||
|
||||
/obj/item/clothing/glasses/meson/truesight
|
||||
name = "The Lens of Truesight"
|
||||
desc = "I can see forever!"
|
||||
icon_state = "monocle"
|
||||
item_state = "headset"
|
||||
item_state = "headset"
|
||||
|
||||
// Die of Fate
|
||||
/obj/item/dice/d20/fate
|
||||
name = "\improper Die of Fate"
|
||||
desc = "A die with twenty sides. You can feel unearthly energies radiating from it. Using this might be VERY risky."
|
||||
icon_state = "d20"
|
||||
var/reusable = TRUE
|
||||
var/used = FALSE
|
||||
|
||||
/obj/item/dice/d20/fate/stealth
|
||||
name = "d20"
|
||||
desc = "A die with twenty sides. The preferred die to throw at the GM."
|
||||
|
||||
/obj/item/dice/d20/fate/one_use
|
||||
reusable = FALSE
|
||||
|
||||
/obj/item/dice/d20/fate/one_use/stealth
|
||||
name = "d20"
|
||||
desc = "A die with twenty sides. The preferred die to throw at the GM."
|
||||
|
||||
/obj/item/dice/d20/fate/cursed
|
||||
name = "cursed Die of Fate"
|
||||
desc = "A die with twenty sides. You feel that rolling this is a REALLY bad idea."
|
||||
color = "#00BB00"
|
||||
|
||||
rigged = DICE_TOTALLY_RIGGED
|
||||
rigged_value = 1
|
||||
|
||||
/obj/item/dice/d20/fate/diceroll(mob/user)
|
||||
. = ..()
|
||||
if(!used)
|
||||
if(!ishuman(user) || !user.mind || (user.mind in SSticker.mode.wizards))
|
||||
to_chat(user, "<span class='warning'>You feel the magic of the dice is restricted to ordinary humans!</span>")
|
||||
return
|
||||
|
||||
if(!reusable)
|
||||
used = TRUE
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
T.visible_message("<span class='userdanger'>[src] flares briefly.</span>")
|
||||
|
||||
addtimer(CALLBACK(src, .proc/effect, user, .), 1 SECONDS)
|
||||
|
||||
/obj/item/dice/d20/fate/equipped(mob/user, slot)
|
||||
if(!ishuman(user) || !user.mind || (user.mind in SSticker.mode.wizards))
|
||||
to_chat(user, "<span class='warning'>You feel the magic of the dice is restricted to ordinary humans! You should leave it alone.</span>")
|
||||
forceMove(get_turf(user))
|
||||
|
||||
/obj/item/dice/d20/fate/proc/effect(var/mob/living/carbon/human/user, roll)
|
||||
var/turf/T = get_turf(src)
|
||||
switch(roll)
|
||||
if(1)
|
||||
//Dust
|
||||
T.visible_message("<span class='userdanger'>[user] turns to dust!</span>")
|
||||
user.dust()
|
||||
if(2)
|
||||
//Death
|
||||
T.visible_message("<span class='userdanger'>[user] suddenly dies!</span>")
|
||||
user.death()
|
||||
if(3)
|
||||
//Swarm of creatures
|
||||
T.visible_message("<span class='userdanger'>A swarm of creatures surround [user]!</span>")
|
||||
for(var/direction in alldirs)
|
||||
new /mob/living/simple_animal/hostile/netherworld(get_step(get_turf(user),direction))
|
||||
if(4)
|
||||
//Destroy Equipment
|
||||
T.visible_message("<span class='userdanger'>Everything [user] is holding and wearing disappears!</span>")
|
||||
for(var/obj/item/I in user)
|
||||
if(istype(I, /obj/item/implant))
|
||||
continue
|
||||
qdel(I)
|
||||
if(5)
|
||||
//Monkeying
|
||||
T.visible_message("<span class='userdanger'>[user] transforms into a monkey!</span>")
|
||||
user.monkeyize()
|
||||
if(6)
|
||||
//Cut speed
|
||||
T.visible_message("<span class='userdanger'>[user] starts moving slower!</span>")
|
||||
var/datum/species/S = user.dna.species
|
||||
S.slowdown += 1
|
||||
if(7)
|
||||
//Throw
|
||||
T.visible_message("<span class='userdanger'>Unseen forces throw [user]!</span>")
|
||||
user.Stun(60)
|
||||
user.adjustBruteLoss(50)
|
||||
var/throw_dir = cardinal
|
||||
var/atom/throw_target = get_edge_target_turf(user, throw_dir)
|
||||
user.throw_at(throw_target, 200, 4)
|
||||
if(8)
|
||||
//Fueltank Explosion
|
||||
T.visible_message("<span class='userdanger'>An explosion bursts into existence around [user]!</span>")
|
||||
explosion(get_turf(user),-1,0,2, flame_range = 2)
|
||||
if(9)
|
||||
//Cold
|
||||
var/datum/disease/D = new /datum/disease/cold()
|
||||
T.visible_message("<span class='userdanger'>[user] looks a little under the weather!</span>")
|
||||
user.ForceContractDisease(D)
|
||||
if(10)
|
||||
//Nothing
|
||||
T.visible_message("<span class='userdanger'>Nothing seems to happen.</span>")
|
||||
if(11)
|
||||
//Cookie
|
||||
T.visible_message("<span class='userdanger'>A cookie appears out of thin air!</span>")
|
||||
var/obj/item/reagent_containers/food/snacks/cookie/C = new(drop_location())
|
||||
do_smoke(0, drop_location())
|
||||
C.name = "Cookie of Fate"
|
||||
if(12)
|
||||
//Healing
|
||||
T.visible_message("<span class='userdanger'>[user] looks very healthy!</span>")
|
||||
user.revive(full_heal = 1, admin_revive = 1)
|
||||
if(13)
|
||||
//Mad Dosh
|
||||
T.visible_message("<span class='userdanger'>Mad dosh shoots out of [src]!</span>")
|
||||
var/turf/Start = get_turf(src)
|
||||
for(var/direction in alldirs)
|
||||
var/turf/dirturf = get_step(Start,direction)
|
||||
if(rand(0,1))
|
||||
new /obj/item/stack/spacecash/c1000(dirturf)
|
||||
else
|
||||
var/obj/item/storage/bag/money/M = new(dirturf)
|
||||
for(var/i in 1 to rand(5,50))
|
||||
new /obj/item/coin/gold(M)
|
||||
if(14)
|
||||
//Free Gun
|
||||
T.visible_message("<span class='userdanger'>An impressive gun appears!</span>")
|
||||
do_smoke(0, drop_location())
|
||||
new /obj/item/gun/projectile/revolver/mateba(drop_location())
|
||||
if(15)
|
||||
//Random One-use spellbook
|
||||
T.visible_message("<span class='userdanger'>A magical looking book drops to the floor!</span>")
|
||||
do_smoke(0, drop_location())
|
||||
new /obj/item/spellbook/oneuse/random(drop_location())
|
||||
if(16)
|
||||
//Servant & Servant Summon
|
||||
T.visible_message("<span class='userdanger'>A Dice Servant appears in a cloud of smoke!</span>")
|
||||
var/mob/living/carbon/human/H = new(drop_location())
|
||||
do_smoke(0, drop_location())
|
||||
|
||||
H.equipOutfit(/datum/outfit/butler)
|
||||
var/datum/mind/servant_mind = new /datum/mind()
|
||||
var/datum/objective/O = new
|
||||
O.owner = servant_mind
|
||||
O.target = H.mind
|
||||
O.explanation_text = "Serve [user.real_name]."
|
||||
servant_mind.objectives += O
|
||||
servant_mind.transfer_to(H)
|
||||
|
||||
var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as the servant of [user.real_name]?", ROLE_WIZARD, poll_time = 50)
|
||||
if(LAZYLEN(candidates))
|
||||
var/mob/dead/observer/C = pick(candidates)
|
||||
message_admins("[ADMIN_LOOKUPFLW(C)] was spawned as Dice Servant")
|
||||
H.key = C.key
|
||||
|
||||
var/obj/effect/proc_holder/spell/targeted/summonmob/S = new
|
||||
S.target_mob = H
|
||||
user.mind.AddSpell(S)
|
||||
|
||||
if(17)
|
||||
//Tator Kit
|
||||
T.visible_message("<span class='userdanger'>A suspicious box appears!</span>")
|
||||
new /obj/item/storage/box/syndicate(drop_location())
|
||||
do_smoke(0, drop_location())
|
||||
if(18)
|
||||
//Captain ID
|
||||
T.visible_message("<span class='userdanger'>A golden identification card appears!</span>")
|
||||
new /obj/item/card/id/captains_spare(drop_location())
|
||||
do_smoke(0, drop_location())
|
||||
if(19)
|
||||
//Instrinct Resistance
|
||||
T.visible_message("<span class='userdanger'>[user] looks very robust!</span>")
|
||||
var/datum/species/S = user.dna.species
|
||||
S.brute_mod *= 0.5
|
||||
S.burn_mod *= 0.5
|
||||
|
||||
if(20)
|
||||
//Free wizard!
|
||||
T.visible_message("<span class='userdanger'>Magic flows out of [src] and into [user]!</span>")
|
||||
user.mind.make_Wizard()
|
||||
|
||||
// Butler outfit
|
||||
/datum/outfit/butler
|
||||
name = "Butler"
|
||||
uniform = /obj/item/clothing/under/suit_jacket/really_black
|
||||
shoes = /obj/item/clothing/shoes/laceup
|
||||
head = /obj/item/clothing/head/bowlerhat
|
||||
glasses = /obj/item/clothing/glasses/monocle
|
||||
gloves = /obj/item/clothing/gloves/color/white
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/summonmob
|
||||
name = "Summon Servant"
|
||||
desc = "This spell can be used to call your servant, whenever you need it."
|
||||
charge_max = 100
|
||||
clothes_req = 0
|
||||
invocation = "JE VES"
|
||||
invocation_type = "whisper"
|
||||
range = -1
|
||||
level_max = 0 //cannot be improved
|
||||
cooldown_min = 100
|
||||
include_user = 1
|
||||
|
||||
var/mob/living/target_mob
|
||||
|
||||
action_icon_state = "summons"
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/summonmob/cast(list/targets, mob/user = usr)
|
||||
if(!target_mob)
|
||||
return
|
||||
var/turf/Start = get_turf(user)
|
||||
for(var/direction in alldirs)
|
||||
var/turf/T = get_step(Start,direction)
|
||||
if(!T.density)
|
||||
target_mob.Move(T)
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
/obj/effect/step_trigger/message
|
||||
var/message //the message to give to the mob
|
||||
var/once = 1
|
||||
|
||||
/obj/effect/step_trigger/message/Trigger(mob/M as mob)
|
||||
if(M.client)
|
||||
to_chat(M, "<span class='info'>[message]</span>")
|
||||
if(once)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/step_trigger/teleport_fancy
|
||||
var/locationx
|
||||
var/locationy
|
||||
var/uses = 1 //0 for infinite uses
|
||||
var/entersparks = 0
|
||||
var/exitsparks = 0
|
||||
var/entersmoke = 0
|
||||
var/exitsmoke = 0
|
||||
|
||||
/obj/effect/step_trigger/teleport_fancy/Trigger(mob/M as mob)
|
||||
var/dest = locate(locationx, locationy, z)
|
||||
M.Move(dest)
|
||||
|
||||
if(entersparks)
|
||||
do_sparks(4, 1, src)
|
||||
if(exitsparks)
|
||||
do_sparks(4, 1, dest)
|
||||
|
||||
if(entersmoke)
|
||||
var/datum/effect_system/smoke_spread/s = new
|
||||
s.set_up(4, 1, src, 0)
|
||||
s.start()
|
||||
if(exitsmoke)
|
||||
var/datum/effect_system/smoke_spread/s = new
|
||||
s.set_up(4, 1, dest, 0)
|
||||
s.start()
|
||||
|
||||
uses--
|
||||
if(uses == 0)
|
||||
qdel(src)
|
||||
@@ -12,8 +12,12 @@
|
||||
/obj/structure/closet/crate/necropolis/tendril
|
||||
desc = "It's watching you suspiciously."
|
||||
|
||||
/obj/structure/closet/crate/necropolis/tendril/New()
|
||||
/obj/structure/closet/crate/necropolis/tendril/New(add_loot = TRUE)
|
||||
..()
|
||||
|
||||
if(!add_loot)
|
||||
return
|
||||
|
||||
var/loot = rand(1,24)
|
||||
switch(loot)
|
||||
if(1)
|
||||
@@ -68,4 +72,19 @@
|
||||
new /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/inquisitor(src)
|
||||
new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor(src)
|
||||
if(24)
|
||||
new /obj/item/spellbook/oneuse/summonitem(src)
|
||||
new /obj/item/spellbook/oneuse/summonitem(src)
|
||||
|
||||
/obj/structure/closet/crate/necropolis/puzzle
|
||||
name = "puzzling chest"
|
||||
|
||||
/obj/structure/closet/crate/necropolis/puzzle/New()
|
||||
..(FALSE)
|
||||
|
||||
var/loot = rand(1,3)
|
||||
switch(loot)
|
||||
if(1)
|
||||
new /obj/item/soulstone/anybody(src)
|
||||
if(2)
|
||||
new /obj/item/wisp_lantern(src)
|
||||
if(3)
|
||||
new /obj/item/prisoncube(src)
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
icon = 'icons/mob/alien.dmi'
|
||||
icon_state = "alienh_running"
|
||||
icon_living = "alienh_running"
|
||||
icon_dead = "alien_l"
|
||||
icon_dead = "alienh_dead"
|
||||
icon_gib = "syndicate_gib"
|
||||
response_help = "pokes the"
|
||||
response_disarm = "shoves the"
|
||||
@@ -40,7 +40,7 @@
|
||||
name = "alien drone"
|
||||
icon_state = "aliend_running"
|
||||
icon_living = "aliend_running"
|
||||
icon_dead = "aliend_l"
|
||||
icon_dead = "aliend_dead"
|
||||
health = 60
|
||||
maxHealth = 60
|
||||
melee_damage_lower = 15
|
||||
@@ -61,7 +61,7 @@
|
||||
name = "alien sentinel"
|
||||
icon_state = "aliens_running"
|
||||
icon_living = "aliens_running"
|
||||
icon_dead = "aliens_l"
|
||||
icon_dead = "aliens_dead"
|
||||
health = 120
|
||||
maxHealth = 120
|
||||
melee_damage_lower = 15
|
||||
@@ -77,7 +77,7 @@
|
||||
name = "alien queen"
|
||||
icon_state = "alienq_running"
|
||||
icon_living = "alienq_running"
|
||||
icon_dead = "alienq_l"
|
||||
icon_dead = "alienq_d"
|
||||
health = 250
|
||||
maxHealth = 250
|
||||
melee_damage_lower = 15
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
/mob/living/simple_animal/hostile/creature
|
||||
name = "creature"
|
||||
desc = "A sanity-destroying otherthing."
|
||||
icon = 'icons/mob/critter.dmi'
|
||||
speak_emote = list("gibbers")
|
||||
icon_state = "otherthing"
|
||||
icon_living = "otherthing"
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
maxHealth = 250
|
||||
max_mobs = 3
|
||||
spawn_time = 300 //30 seconds default
|
||||
mob_type = /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril
|
||||
mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril)
|
||||
spawn_text = "emerges from"
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 0
|
||||
@@ -73,7 +73,7 @@
|
||||
qdel(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/lavaland/goliath
|
||||
mob_type = /mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril
|
||||
mob_types = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril)
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/lavaland/legion
|
||||
mob_type = /mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril
|
||||
mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril)
|
||||
@@ -0,0 +1,111 @@
|
||||
/mob/living/simple_animal/hostile/netherworld
|
||||
name = "creature"
|
||||
desc = "A sanity-destroying otherthing from the netherworld."
|
||||
icon_state = "otherthing"
|
||||
icon_living = "otherthing"
|
||||
icon_dead = "otherthing-dead"
|
||||
health = 80
|
||||
maxHealth = 80
|
||||
obj_damage = 100
|
||||
melee_damage_lower = 25
|
||||
melee_damage_upper = 50
|
||||
attacktext = "slashes"
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg'
|
||||
faction = list("creature")
|
||||
speak_emote = list("screams")
|
||||
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 0
|
||||
faction = list("nether")
|
||||
|
||||
/mob/living/simple_animal/hostile/netherworld/migo
|
||||
name = "mi-go"
|
||||
desc = "A pinkish, fungoid crustacean-like creature with numerous pairs of clawed appendages and a head covered with waving antennae."
|
||||
speak_emote = list("screams", "clicks", "chitters", "barks", "moans", "growls", "meows", "reverberates", "roars", "squeaks", "rattles", "exclaims", "yells", "remarks", "mumbles", "jabbers", "stutters", "seethes")
|
||||
icon_state = "mi-go"
|
||||
icon_living = "mi-go"
|
||||
icon_dead = "mi-go-dead"
|
||||
attacktext = "lacerates"
|
||||
speed = -0.5
|
||||
var/static/list/migo_sounds
|
||||
deathmessage = "wails as its form turns into a pulpy mush."
|
||||
death_sound = 'sound/voice/hiss6.ogg'
|
||||
|
||||
/mob/living/simple_animal/hostile/netherworld/migo/Initialize()
|
||||
. = ..()
|
||||
migo_sounds = list('sound/items/bubblewrap.ogg', 'sound/items/change_jaws.ogg', 'sound/items/crowbar.ogg', 'sound/items/drink.ogg', 'sound/items/deconstruct.ogg', 'sound/items/change_drill.ogg', 'sound/items/dodgeball.ogg', 'sound/items/eatfood.ogg', 'sound/items/screwdriver.ogg', 'sound/items/weeoo1.ogg', 'sound/items/wirecutter.ogg', 'sound/items/welder.ogg', 'sound/items/zip.ogg', 'sound/items/rped.ogg', 'sound/items/ratchet.ogg', 'sound/items/polaroid1.ogg', 'sound/items/pshoom.ogg', 'sound/items/airhorn.ogg', 'sound/voice/bcreep.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/ed209_20sec.ogg', 'sound/voice/hiss3.ogg', 'sound/voice/hiss6.ogg', 'sound/voice/mpatchedup.ogg', 'sound/voice/mfeelbetter.ogg', 'sound/weapons/sear.ogg', 'sound/ambience/antag/tatoralert.ogg', 'sound/mecha/nominal.ogg', 'sound/mecha/weapdestr.ogg', 'sound/mecha/critdestr.ogg', 'sound/mecha/imag_enh.ogg', 'sound/effects/adminhelp.ogg', 'sound/effects/alert.ogg', 'sound/effects/attackblob.ogg', 'sound/effects/bamf.ogg', 'sound/effects/blobattack.ogg', 'sound/effects/break_stone.ogg', 'sound/effects/bubbles.ogg', 'sound/effects/bubbles2.ogg', 'sound/effects/clang.ogg', 'sound/effects/clownstep2.ogg', 'sound/effects/dimensional_rend.ogg', 'sound/effects/doorcreaky.ogg', 'sound/effects/empulse.ogg', 'sound/effects/explosionfar.ogg', 'sound/effects/explosion1.ogg', 'sound/effects/grillehit.ogg', 'sound/effects/genetics.ogg', 'sound/effects/heartbeat.ogg', 'sound/effects/hyperspace_begin.ogg', 'sound/effects/hyperspace_end.ogg', 'sound/goonstation/effects/screech.ogg', 'sound/effects/phasein.ogg', 'sound/effects/picaxe1.ogg', 'sound/effects/sparks1.ogg', 'sound/effects/smoke.ogg', 'sound/effects/splat.ogg', 'sound/effects/snap.ogg', 'sound/effects/tendril_destroyed.ogg', 'sound/effects/supermatter.ogg', 'sound/misc/desceration-01.ogg', 'sound/misc/desceration-02.ogg', 'sound/misc/desceration-03.ogg', 'sound/misc/bloblarm.ogg', 'sound/goonstation/misc/airraid_loop.ogg', 'sound/misc/interference.ogg', 'sound/misc/notice1.ogg', 'sound/misc/notice2.ogg', 'sound/misc/sadtrombone.ogg', 'sound/misc/slip.ogg', 'sound/weapons/armbomb.ogg', 'sound/weapons/chainsaw.ogg', 'sound/weapons/emitter.ogg', 'sound/weapons/emitter2.ogg', 'sound/weapons/blade1.ogg', 'sound/weapons/bladeslice.ogg', 'sound/weapons/blastcannon.ogg', 'sound/weapons/blaster.ogg', 'sound/weapons/bulletflyby3.ogg', 'sound/weapons/circsawhit.ogg', 'sound/weapons/cqchit2.ogg', 'sound/weapons/drill.ogg', 'sound/weapons/genhit1.ogg', 'sound/weapons/gunshots/gunshot_silenced.ogg', 'sound/weapons/gunshots/gunshot.ogg', 'sound/weapons/handcuffs.ogg', 'sound/weapons/homerun.ogg', 'sound/weapons/kenetic_accel.ogg', 'sound/machines/fryer/deep_fryer_emerge.ogg', 'sound/machines/airlock_alien_prying.ogg', 'sound/machines/airlock_close.ogg', 'sound/machines/airlockforced.ogg', 'sound/machines/airlock_open.ogg', 'sound/machines/alarm.ogg', 'sound/machines/blender.ogg', 'sound/machines/boltsdown.ogg', 'sound/machines/boltsup.ogg', 'sound/machines/buzz-sigh.ogg', 'sound/machines/buzz-two.ogg', 'sound/machines/chime.ogg', 'sound/machines/defib_charge.ogg', 'sound/machines/defib_failed.ogg', 'sound/machines/defib_ready.ogg', 'sound/machines/defib_zap.ogg', 'sound/machines/deniedbeep.ogg', 'sound/machines/ding.ogg', 'sound/machines/disposalflush.ogg', 'sound/machines/door_close.ogg', 'sound/machines/door_open.ogg', 'sound/machines/engine_alert1.ogg', 'sound/machines/engine_alert2.ogg', 'sound/machines/hiss.ogg', 'sound/machines/honkbot_evil_laugh.ogg', 'sound/machines/juicer.ogg', 'sound/machines/ping.ogg', 'sound/ambience/signal.ogg', 'sound/machines/synth_no.ogg', 'sound/machines/synth_yes.ogg', 'sound/machines/terminal_alert.ogg', 'sound/machines/twobeep.ogg', 'sound/machines/ventcrawl.ogg', 'sound/machines/warning-buzzer.ogg', 'sound/ai/outbreak5.ogg', 'sound/ai/outbreak7.ogg', 'sound/ai/poweroff.ogg', 'sound/ai/radiation.ogg', 'sound/ai/shuttlecalled.ogg', 'sound/ai/shuttledock.ogg', 'sound/ai/shuttlerecalled.ogg', 'sound/ai/aimalf.ogg') //hahahaha fuck you code divers
|
||||
|
||||
/mob/living/simple_animal/hostile/netherworld/migo/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
|
||||
..()
|
||||
if(stat)
|
||||
return
|
||||
var/chosen_sound = pick(migo_sounds)
|
||||
playsound(src, chosen_sound, 50, TRUE)
|
||||
|
||||
/mob/living/simple_animal/hostile/netherworld/migo/Life()
|
||||
..()
|
||||
if(stat)
|
||||
return
|
||||
if(prob(10))
|
||||
var/chosen_sound = pick(migo_sounds)
|
||||
playsound(src, chosen_sound, 50, TRUE)
|
||||
|
||||
/mob/living/simple_animal/hostile/netherworld/blankbody
|
||||
name = "blank body"
|
||||
desc = "This looks human enough, but its flesh has an ashy texture, and it's face is featureless save an eerie smile."
|
||||
icon_state = "blank-body"
|
||||
icon_living = "blank-body"
|
||||
icon_dead = "blank-dead"
|
||||
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
|
||||
health = 100
|
||||
maxHealth = 100
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 10
|
||||
attacktext = "punches"
|
||||
deathmessage = "falls apart into a fine dust."
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner
|
||||
name = "netherworld link"
|
||||
desc = null //see examine()
|
||||
icon_state = "nether"
|
||||
health = 50
|
||||
spawn_time = 600 //1 minute
|
||||
max_mobs = 15
|
||||
icon = 'icons/mob/nest.dmi'
|
||||
spawn_text = "crawls through"
|
||||
mob_types = list(/mob/living/simple_animal/hostile/netherworld/migo, /mob/living/simple_animal/hostile/netherworld, /mob/living/simple_animal/hostile/netherworld/blankbody)
|
||||
faction = list("nether")
|
||||
|
||||
/obj/structure/spawner/nether/Initialize()
|
||||
.=..()
|
||||
START_PROCESSING(SSprocessing, src)
|
||||
|
||||
/obj/structure/spawner/nether/examine(mob/user)
|
||||
..()
|
||||
if(isskeleton(user))
|
||||
to_chat(user, "A direct link to another dimension full of creatures very happy to see you. <span class='nicegreen'>You can see your house from here!</span>")
|
||||
else
|
||||
to_chat(user, "A direct link to another dimension full of creatures not very happy to see you. <span class='warning'>Entering the link would be a very bad idea.</span>")
|
||||
|
||||
/obj/structure/spawner/nether/attack_hand(mob/user)
|
||||
. = ..()
|
||||
if(isskeleton(user))
|
||||
to_chat(user, "<span class='notice'>You don't feel like going home yet...</span>")
|
||||
else
|
||||
user.visible_message("<span class='warning'>[user] is violently pulled into the link!</span>", \
|
||||
"<span class='userdanger'>Touching the portal, you are quickly pulled through into a world of unimaginable horror!</span>")
|
||||
contents.Add(user)
|
||||
|
||||
/obj/structure/spawner/nether/process()
|
||||
for(var/mob/living/M in contents)
|
||||
if(M)
|
||||
playsound(src, 'sound/magic/demon_consume.ogg', 50, 1)
|
||||
M.adjustBruteLoss(60)
|
||||
new /obj/effect/gibspawner/generic(get_turf(M), M)
|
||||
if(M.stat == DEAD)
|
||||
var/mob/living/simple_animal/hostile/netherworld/blankbody/blank
|
||||
blank = new(loc)
|
||||
blank.name = "[M]"
|
||||
blank.desc = "It's [M], but [M.p_their()] flesh has an ashy texture, and [M.p_their()] face is featureless save an eerie smile."
|
||||
visible_message("<span class='warning'>[M] reemerges from the link!</span>")
|
||||
qdel(M)
|
||||
@@ -7,7 +7,7 @@
|
||||
var/max_mobs = 5
|
||||
var/spawn_delay = 0
|
||||
var/spawn_time = 300 //30 seconds default
|
||||
var/mob_type = /mob/living/simple_animal/hostile/carp
|
||||
var/mob_types = list(/mob/living/simple_animal/hostile/carp)
|
||||
var/spawn_text = "emerges from"
|
||||
status_flags = 0
|
||||
move_resist = MOVE_FORCE_VERY_STRONG
|
||||
@@ -39,7 +39,8 @@
|
||||
if(spawn_delay > world.time)
|
||||
return 0
|
||||
spawn_delay = world.time + spawn_time
|
||||
var/mob/living/simple_animal/L = new mob_type(src.loc)
|
||||
var/chosen_type = pick(mob_types)
|
||||
var/mob/living/simple_animal/L = new chosen_type(loc)
|
||||
L.admin_spawned = admin_spawned //If we were admin spawned, lets have our children count as that as well.
|
||||
spawned_mobs += L
|
||||
L.nest = src
|
||||
@@ -51,7 +52,7 @@
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "syndbeacon"
|
||||
spawn_text = "warps in from"
|
||||
mob_type = /mob/living/simple_animal/hostile/syndicate/ranged
|
||||
mob_types = list(/mob/living/simple_animal/hostile/syndicate/ranged)
|
||||
faction = list("syndicate")
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/mining
|
||||
@@ -64,21 +65,21 @@
|
||||
max_mobs = 3
|
||||
icon = 'icons/mob/nest.dmi'
|
||||
spawn_text = "crawls out of"
|
||||
mob_type = /mob/living/simple_animal/hostile/asteroid/goldgrub
|
||||
mob_types = list(/mob/living/simple_animal/hostile/asteroid/goldgrub)
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
faction = list("mining")
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/mining/goliath
|
||||
name = "goliath den"
|
||||
desc = "A den housing a nest of goliaths, oh god why?"
|
||||
mob_type = /mob/living/simple_animal/hostile/asteroid/goliath
|
||||
mob_types = list(/mob/living/simple_animal/hostile/asteroid/goliath)
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/mining/hivelord
|
||||
name = "hivelord den"
|
||||
desc = "A den housing a nest of hivelords."
|
||||
mob_type = /mob/living/simple_animal/hostile/asteroid/hivelord
|
||||
mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord)
|
||||
|
||||
/mob/living/simple_animal/hostile/spawner/mining/basilisk
|
||||
name = "basilisk den"
|
||||
desc = "A den housing a nest of basilisks, bring a coat."
|
||||
mob_type = /mob/living/simple_animal/hostile/asteroid/basilisk
|
||||
mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk)
|
||||
|
||||
@@ -40,6 +40,14 @@
|
||||
/datum/proc/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/nano_ui/master_ui = null, var/datum/topic_state/state = default_state)
|
||||
return
|
||||
|
||||
/**
|
||||
* The UI-close proc is called when the UI is closed.
|
||||
*
|
||||
* @param user /mob The mob who was interacting with this UI.
|
||||
*/
|
||||
/datum/proc/on_ui_close(mob/user)
|
||||
return
|
||||
|
||||
/**
|
||||
* The ui_data proc is used to get data for the interface
|
||||
*
|
||||
|
||||
@@ -444,6 +444,8 @@ nanoui is used to open and update nano browser uis
|
||||
for(var/datum/nanoui/child in children)
|
||||
child.close()
|
||||
|
||||
src_object.on_ui_close(user)
|
||||
|
||||
/**
|
||||
* Set the UI window to call the nanoclose verb when the window is closed
|
||||
* This allows Nano to handle closed windows
|
||||
|
||||
@@ -299,6 +299,18 @@
|
||||
user.apply_damage(300, BRUTE, affecting)
|
||||
user.visible_message("<span class='danger'>[user.name] fires [src] at [user.p_their()] head!</span>", "<span class='userdanger'>You fire [src] at your head!</span>", "<span class='italics'>You hear a gunshot!</span>")
|
||||
|
||||
/obj/item/gun/projectile/revolver/russian/soul
|
||||
name = "cursed Russian revolver"
|
||||
desc = "To play with this revolver requires wagering your very soul."
|
||||
|
||||
/obj/item/gun/projectile/revolver/russian/soul/shoot_self(mob/living/user)
|
||||
..()
|
||||
var/obj/item/soulstone/anybody/SS = new /obj/item/soulstone/anybody(get_turf(src))
|
||||
if(!SS.transfer_soul("FORCE", user)) //Something went wrong
|
||||
qdel(SS)
|
||||
return
|
||||
user.visible_message("<span class='danger'>[user.name]'s soul is captured by \the [src]!</span>", "<span class='userdanger'>You've lost the gamble! Your soul is forfeit!</span>")
|
||||
|
||||
/obj/item/gun/projectile/revolver/capgun
|
||||
name = "cap gun"
|
||||
desc = "Looks almost like the real thing! Ages 8 and up."
|
||||
|
||||
@@ -115,6 +115,24 @@
|
||||
update_flags |= M.adjustToxLoss(1, FALSE)
|
||||
return list(0, update_flags)
|
||||
|
||||
/datum/reagent/consumable/ethanol/hooch
|
||||
name = "Hooch"
|
||||
id = "hooch"
|
||||
description = "Either someone's failure at cocktail making or attempt in alcohol production. In any case, do you really want to drink that?"
|
||||
color = "#664300" // rgb: 102, 67, 0
|
||||
dizzy_adj = 7
|
||||
alcohol_perc = 1
|
||||
drink_icon = "glass_brown2"
|
||||
drink_name = "Hooch"
|
||||
drink_desc = "You've really hit rock bottom now... your liver packed its bags and left last night."
|
||||
taste_message = "pure resignation"
|
||||
|
||||
/datum/reagent/consumable/ethanol/hooch/on_mob_life(mob/living/carbon/M)
|
||||
if(M.mind && M.mind.assigned_role == "Assistant")
|
||||
M.heal_organ_damage(1, 1)
|
||||
. = 1
|
||||
return ..() || .
|
||||
|
||||
/datum/reagent/consumable/ethanol/rum
|
||||
name = "Rum"
|
||||
id = "rum"
|
||||
@@ -1361,3 +1379,15 @@
|
||||
taste_message = flavor
|
||||
if(holder.my_atom)
|
||||
holder.my_atom.on_reagent_change()
|
||||
|
||||
/datum/reagent/consumable/ethanol/bacchus_blessing //An EXTREMELY powerful drink. Smashed in seconds, dead in minutes.
|
||||
name = "Bacchus' Blessing"
|
||||
id = "bacchus_blessing"
|
||||
description = "Unidentifiable mixture. Unmeasurably high alcohol content."
|
||||
color = rgb(51, 19, 3) //Sickly brown
|
||||
dizzy_adj = 21
|
||||
alcohol_perc = 3 //I warned you
|
||||
drink_icon = "glass_brown2"
|
||||
drink_name = "Bacchus' Blessing"
|
||||
drink_desc = "You didn't think it was possible for a liquid to be so utterly revolting. Are you sure about this...?"
|
||||
taste_message = "a wall of bricks"
|
||||
|
||||
@@ -290,6 +290,11 @@
|
||||
addiction_chance = 5
|
||||
taste_message = "health"
|
||||
|
||||
/datum/reagent/medicine/omnizine/godblood
|
||||
name = "Godblood"
|
||||
description = "Slowly heals all damage types. Has a rather high overdose threshold. Glows with mysterious power."
|
||||
overdose_threshold = 150
|
||||
|
||||
/datum/reagent/medicine/omnizine/on_mob_life(mob/living/M)
|
||||
var/update_flags = STATUS_UPDATE_NONE
|
||||
update_flags |= M.adjustToxLoss(-1*REAGENTS_EFFECT_MULTIPLIER, FALSE)
|
||||
|
||||
@@ -1174,3 +1174,14 @@
|
||||
M.electrocute_act(rand(5, 20), "Teslium in their body", 1, TRUE) //Override because it's caused from INSIDE of you
|
||||
playsound(M, "sparks", 50, 1)
|
||||
return ..()
|
||||
|
||||
/datum/reagent/gluttonytoxin
|
||||
name = "Gluttony's Blessing"
|
||||
id = "gluttonytoxin"
|
||||
description = "An advanced corruptive toxin produced by something terrible."
|
||||
reagent_state = LIQUID
|
||||
color = "#5EFF3B" //RGB: 94, 255, 59
|
||||
taste_message = "decay"
|
||||
|
||||
/datum/reagent/gluttonytoxin/reaction_mob(mob/living/L, method=TOUCH, reac_volume)
|
||||
L.ForceContractDisease(new /datum/disease/transformation/morph())
|
||||
|
||||
@@ -851,4 +851,20 @@
|
||||
required_reagents = list("rum" = 5, "cream" = 5, "egg" = 5)
|
||||
result_amount = 15
|
||||
mix_message = "The eggs nog together. Pretend that \"nog\" is a verb."
|
||||
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
|
||||
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
|
||||
|
||||
/datum/chemical_reaction/hooch
|
||||
name = "Hooch"
|
||||
id = "hooch"
|
||||
result = "hooch"
|
||||
required_reagents = list("ethanol" = 2, "fuel" = 1)
|
||||
result_amount = 3
|
||||
required_catalysts = list("enzyme" = 1)
|
||||
|
||||
/datum/chemical_reaction/bacchus_blessing
|
||||
name = "Bacchus' Blessing"
|
||||
id = "bacchus_blessing"
|
||||
result = "bacchus_blessing"
|
||||
required_reagents = list("hooch" = 1, "absinthe" = 1, "manlydorf" = 1, "syndicatebomb" = 1)
|
||||
result_amount = 4
|
||||
mix_message = "<span class='warning'>The mixture turns to a sickening froth.</span>"
|
||||
@@ -289,12 +289,6 @@
|
||||
icon_state = "[rounded_vol]"
|
||||
item_state = "syringe_[rounded_vol]"
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// Syringes. END
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/obj/item/reagent_containers/syringe/antiviral
|
||||
name = "Syringe (spaceacillin)"
|
||||
desc = "Contains antiviral agents."
|
||||
@@ -327,3 +321,10 @@
|
||||
name = "bioterror syringe"
|
||||
desc = "Contains several paralyzing reagents."
|
||||
list_reagents = list("neurotoxin" = 5, "capulettium_plus" = 5, "sodium_thiopental" = 5)
|
||||
|
||||
/obj/item/reagent_containers/syringe/gluttony
|
||||
name = "Gluttony's Blessing"
|
||||
desc = "A syringe recovered from a dread place. It probably isn't wise to use."
|
||||
amount_per_transfer_from_this = 1
|
||||
volume = 1
|
||||
list_reagents = list("gluttonytoxin" = 1)
|
||||
@@ -0,0 +1,244 @@
|
||||
// Dead Ratvar
|
||||
/obj/structure/dead_ratvar
|
||||
name = "hulking wreck"
|
||||
desc = "The remains of a monstrous war machine."
|
||||
icon = 'icons/obj/lavaland/dead_ratvar.dmi'
|
||||
icon_state = "dead_ratvar"
|
||||
flags = ON_BORDER
|
||||
appearance_flags = 0
|
||||
layer = FLY_LAYER
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
bound_width = 416
|
||||
bound_height = 64
|
||||
pixel_y = -10
|
||||
unacidable = TRUE
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF
|
||||
|
||||
// An "overlay" used by clockwork walls and floors to appear normal to mesons.
|
||||
/obj/effect/clockwork/overlay
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
var/atom/linked
|
||||
|
||||
/obj/effect/clockwork/overlay/examine(mob/user)
|
||||
if(linked)
|
||||
linked.examine(user)
|
||||
|
||||
/obj/effect/clockwork/overlay/ex_act()
|
||||
return FALSE
|
||||
|
||||
/obj/effect/clockwork/overlay/singularity_act()
|
||||
return
|
||||
/obj/effect/clockwork/overlay/singularity_pull()
|
||||
return
|
||||
|
||||
/obj/effect/clockwork/overlay/singularity_pull(S, current_size)
|
||||
return
|
||||
|
||||
/obj/effect/clockwork/overlay/Destroy()
|
||||
if(linked)
|
||||
linked = null
|
||||
. = ..()
|
||||
|
||||
/obj/effect/clockwork/overlay/wall
|
||||
name = "clockwork wall"
|
||||
icon = 'icons/turf/walls/clockwork_wall.dmi'
|
||||
icon_state = "clockwork_wall"
|
||||
canSmoothWith = list(/obj/effect/clockwork/overlay/wall, /obj/structure/falsewall/brass)
|
||||
smooth = SMOOTH_TRUE
|
||||
layer = CLOSED_TURF_LAYER
|
||||
|
||||
/obj/effect/clockwork/overlay/wall/Initialize(mapload)
|
||||
. = ..()
|
||||
queue_smooth_neighbors(src)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/queue_smooth, src), 1)
|
||||
|
||||
/obj/effect/clockwork/overlay/wall/Destroy()
|
||||
queue_smooth_neighbors(src)
|
||||
return ..()
|
||||
|
||||
/obj/effect/clockwork/overlay/floor
|
||||
icon = 'icons/turf/floors.dmi'
|
||||
icon_state = "clockwork_floor"
|
||||
layer = TURF_LAYER
|
||||
plane = FLOOR_PLANE
|
||||
|
||||
/obj/effect/clockwork/overlay/floor/bloodcult //this is used by BLOOD CULT, it shouldn't use such a path...
|
||||
icon_state = "cult"
|
||||
|
||||
// Wall gears
|
||||
//A massive gear, effectively a girder for clocks.
|
||||
/obj/structure/clockwork/wall_gear
|
||||
name = "massive gear"
|
||||
icon = 'icons/obj/clockwork_objects.dmi'
|
||||
icon_state = "wall_gear"
|
||||
climbable = TRUE
|
||||
max_integrity = 100
|
||||
can_deconstruct = TRUE
|
||||
desc = "A massive brass gear. You could probably secure or unsecure it with a wrench, or just climb over it."
|
||||
|
||||
/obj/structure/clockwork/wall_gear/displaced
|
||||
anchored = FALSE
|
||||
|
||||
/obj/structure/clockwork/wall_gear/Initialize()
|
||||
. = ..()
|
||||
new /obj/effect/temp_visual/ratvar/gear(get_turf(src))
|
||||
|
||||
/obj/structure/clockwork/wall_gear/emp_act(severity)
|
||||
return
|
||||
|
||||
/obj/structure/clockwork/wall_gear/attackby(obj/item/I, mob/user, params)
|
||||
if(iswrench(I))
|
||||
default_unfasten_wrench(user, I, 10)
|
||||
return 1
|
||||
else if(isscrewdriver(I))
|
||||
if(anchored)
|
||||
to_chat(user, "<span class='warning'>[src] needs to be unsecured to disassemble it!</span>")
|
||||
else
|
||||
var/obj/item/screwdriver/S = I
|
||||
user.visible_message("<span class='warning'>[user] starts to disassemble [src].</span>", "<span class='notice'>You start to disassemble [src]...</span>")
|
||||
if(do_after(user, 30 * S.toolspeed, target = src) && !anchored)
|
||||
playsound(loc, S.usesound, 50, 1)
|
||||
to_chat(user, "<span class='notice'>You disassemble [src].</span>")
|
||||
deconstruct(TRUE)
|
||||
return 1
|
||||
else if(istype(I, /obj/item/stack/tile/brass))
|
||||
var/obj/item/stack/tile/brass/W = I
|
||||
if(W.get_amount() < 1)
|
||||
to_chat(user, "<span class='warning'>You need one brass sheet to do this!</span>")
|
||||
return
|
||||
var/turf/T = get_turf(src)
|
||||
if(iswallturf(T))
|
||||
to_chat(user, "<span class='warning'>There is already a wall present!</span>")
|
||||
return
|
||||
if(!isfloorturf(T))
|
||||
to_chat(user, "<span class='warning'>A floor must be present to build a [anchored ? "false ":""]wall!</span>")
|
||||
return
|
||||
if(locate(/obj/structure/falsewall) in T.contents)
|
||||
to_chat(user, "<span class='warning'>There is already a false wall present!</span>")
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You start adding [W] to [src]...</span>")
|
||||
if(do_after(user, 20, target = src))
|
||||
var/brass_floor = FALSE
|
||||
if(istype(T, /turf/simulated/floor/clockwork)) //if the floor is already brass, costs less to make(conservation of masssssss)
|
||||
brass_floor = TRUE
|
||||
if(W.use(2 - brass_floor))
|
||||
if(anchored)
|
||||
T.ChangeTurf(/turf/simulated/wall/clockwork)
|
||||
else
|
||||
T.ChangeTurf(/turf/simulated/floor/clockwork)
|
||||
new /obj/structure/falsewall/brass(T)
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need more brass to make a [anchored ? "false ":""]wall!</span>")
|
||||
return 1
|
||||
return ..()
|
||||
|
||||
/obj/structure/clockwork/wall_gear/deconstruct(disassembled = TRUE)
|
||||
if(can_deconstruct && disassembled)
|
||||
new /obj/item/stack/tile/brass(loc, 3)
|
||||
return ..()
|
||||
|
||||
//Shards of Alloy, suitable only as a source of power for a replica fabricator.
|
||||
/obj/item/clockwork/alloy_shards
|
||||
name = "replicant alloy shards"
|
||||
desc = "Broken shards of some oddly malleable metal. They occasionally move and seem to glow."
|
||||
icon = 'icons/obj/clockwork_objects.dmi'
|
||||
icon_state = "alloy_shards"
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF
|
||||
unacidable = TRUE
|
||||
var/randomsinglesprite = FALSE
|
||||
var/randomspritemax = 2
|
||||
var/sprite_shift = 9
|
||||
|
||||
/obj/item/clockwork/alloy_shards/Initialize()
|
||||
. = ..()
|
||||
if(randomsinglesprite)
|
||||
replace_name_desc()
|
||||
icon_state = "[icon_state][rand(1, randomspritemax)]"
|
||||
pixel_x = rand(-sprite_shift, sprite_shift)
|
||||
pixel_y = rand(-sprite_shift, sprite_shift)
|
||||
|
||||
/obj/item/clockwork/alloy_shards/proc/replace_name_desc()
|
||||
name = "replicant alloy shard"
|
||||
desc = "A broken shard of some oddly malleable metal. It occasionally moves and seems to glow."
|
||||
|
||||
/obj/item/clockwork/alloy_shards/clockgolem_remains
|
||||
name = "clockwork golem scrap"
|
||||
desc = "A pile of scrap metal. It seems damaged beyond repair."
|
||||
icon_state = "clockgolem_dead"
|
||||
sprite_shift = 0
|
||||
|
||||
/obj/item/clockwork/alloy_shards/large
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
randomsinglesprite = TRUE
|
||||
icon_state = "shard_large"
|
||||
sprite_shift = 9
|
||||
|
||||
/obj/item/clockwork/alloy_shards/medium
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
randomsinglesprite = TRUE
|
||||
icon_state = "shard_medium"
|
||||
sprite_shift = 10
|
||||
|
||||
/obj/item/clockwork/alloy_shards/medium/gear_bit
|
||||
randomspritemax = 4
|
||||
icon_state = "gear_bit"
|
||||
sprite_shift = 12
|
||||
|
||||
/obj/item/clockwork/alloy_shards/medium/gear_bit/replace_name_desc()
|
||||
name = "gear bit"
|
||||
desc = "A broken chunk of a gear. You want it."
|
||||
|
||||
/obj/item/clockwork/alloy_shards/medium/gear_bit/large //gives more power
|
||||
|
||||
/obj/item/clockwork/alloy_shards/medium/gear_bit/large/replace_name_desc()
|
||||
..()
|
||||
name = "complex gear bit"
|
||||
|
||||
/obj/item/clockwork/alloy_shards/small
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
randomsinglesprite = TRUE
|
||||
randomspritemax = 3
|
||||
icon_state = "shard_small"
|
||||
sprite_shift = 12
|
||||
|
||||
/obj/item/clockwork/alloy_shards/pinion_lock
|
||||
name = "pinion lock"
|
||||
desc = "A dented and scratched gear. It's very heavy."
|
||||
icon_state = "pinion_lock"
|
||||
|
||||
/obj/item/clockwork/component/belligerent_eye
|
||||
name = "belligerent eye"
|
||||
desc = "A brass construct with a rotating red center. It's as though it's looking for something to hurt."
|
||||
icon = 'icons/obj/clockwork_objects.dmi'
|
||||
icon_state = "belligerent_eye"
|
||||
|
||||
/obj/item/clockwork/component/belligerent_eye/blind_eye
|
||||
name = "blind eye"
|
||||
desc = "A heavy brass eye, its red iris fallen dark."
|
||||
icon_state = "blind_eye"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
|
||||
/obj/item/clockwork/component/geis_capacitor/fallen_armor
|
||||
name = "fallen armor"
|
||||
desc = "Lifeless chunks of armor. They're designed in a strange way and won't fit on you."
|
||||
icon = 'icons/obj/clockwork_objects.dmi'
|
||||
icon_state = "fallen_armor"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
|
||||
//Ratvarian spear: A relatively fragile spear from the Celestial Derelict. Deals extreme damage to silicons and enemy cultists, but doesn't last long when summoned.
|
||||
/obj/item/clockwork/weapon/ratvarian_spear
|
||||
name = "ratvarian spear"
|
||||
desc = "A razor-sharp spear made of brass. It thrums with barely-contained energy."
|
||||
icon = 'icons/obj/clockwork_objects.dmi'
|
||||
icon_state = "ratvarian_spear"
|
||||
item_state = "ratvarian_spear"
|
||||
force = 15 //Extra damage is dealt to targets in attack()
|
||||
throwforce = 25
|
||||
armour_penetration = 10
|
||||
sharp = TRUE
|
||||
attack_verb = list("stabbed", "poked", "slashed")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
var/bonus_burn = 5
|
||||
@@ -0,0 +1,49 @@
|
||||
/obj/structure/sacrificealtar
|
||||
name = "sacrificial altar"
|
||||
desc = "An altar designed to perform blood sacrifice for a deity."
|
||||
icon = 'icons/obj/hand_of_god_structures.dmi'
|
||||
icon_state = "sacrificealtar"
|
||||
anchored = TRUE
|
||||
density = FALSE
|
||||
can_buckle = TRUE
|
||||
|
||||
/obj/structure/sacrificealtar/attack_hand(mob/living/user)
|
||||
if(user.incapacitated())
|
||||
return
|
||||
if(!has_buckled_mobs())
|
||||
return
|
||||
var/mob/living/L = buckled_mob
|
||||
if(!L)
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You attempt to sacrifice [L] by invoking the sacrificial ritual.</span>")
|
||||
L.gib()
|
||||
message_admins("[ADMIN_LOOKUPFLW(user)] has sacrificed [key_name_admin(L)] on the sacrificial altar at [AREACOORD(src)].")
|
||||
|
||||
/obj/structure/healingfountain
|
||||
name = "healing fountain"
|
||||
desc = "A fountain containing the waters of life."
|
||||
icon = 'icons/obj/hand_of_god_structures.dmi'
|
||||
icon_state = "fountain"
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
var/time_between_uses = 1800
|
||||
var/last_process = 0
|
||||
|
||||
/obj/structure/healingfountain/attack_hand(mob/living/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
if(last_process + time_between_uses > world.time)
|
||||
to_chat(user, "<span class='notice'>The fountain appears to be empty.</span>")
|
||||
return
|
||||
last_process = world.time
|
||||
to_chat(user, "<span class='notice'>The water feels warm and soothing as you touch it. The fountain immediately dries up shortly afterwards.</span>")
|
||||
user.reagents.add_reagent(/datum/reagent/medicine/omnizine/godblood, 20)
|
||||
update_icon()
|
||||
addtimer(CALLBACK(src, .proc/update_icon), time_between_uses)
|
||||
|
||||
/obj/structure/healingfountain/update_icon()
|
||||
if(last_process + time_between_uses > world.time)
|
||||
icon_state = "fountain"
|
||||
else
|
||||
icon_state = "fountain-red"
|
||||
@@ -0,0 +1,7 @@
|
||||
/obj/effect/spawner/lootdrop/pizzaparty
|
||||
name = "pizza bomb spawner"
|
||||
loot = list(/obj/item/pizzabox/margherita = 3,
|
||||
/obj/item/pizzabox/meat = 3,
|
||||
/obj/item/pizzabox/mushroom = 3,
|
||||
/obj/item/pizza_bomb = 1)
|
||||
lootdoubles = FALSE
|
||||
@@ -0,0 +1,351 @@
|
||||
/obj/effect/sliding_puzzle
|
||||
name = "Sliding puzzle generator"
|
||||
icon = 'icons/obj/items.dmi' //mapping
|
||||
icon_state = "syndballoon"
|
||||
invisibility = INVISIBILITY_ABSTRACT
|
||||
anchored = TRUE
|
||||
var/list/elements
|
||||
var/floor_type = /turf/simulated/floor/vault
|
||||
var/finished = FALSE
|
||||
var/reward_type = /obj/item/reagent_containers/food/snacks/cookie
|
||||
var/element_type = /obj/structure/puzzle_element
|
||||
var/auto_setup = TRUE
|
||||
var/empty_tile_id
|
||||
|
||||
//Gets the turf where the tile with given id should be
|
||||
/obj/effect/sliding_puzzle/proc/get_turf_for_id(id)
|
||||
var/turf/center = get_turf(src)
|
||||
switch(id)
|
||||
if(1)
|
||||
return get_step(center,NORTHWEST)
|
||||
if(2)
|
||||
return get_step(center,NORTH)
|
||||
if(3)
|
||||
return get_step(center,NORTHEAST)
|
||||
if(4)
|
||||
return get_step(center,WEST)
|
||||
if(5)
|
||||
return center
|
||||
if(6)
|
||||
return get_step(center,EAST)
|
||||
if(7)
|
||||
return get_step(center,SOUTHWEST)
|
||||
if(8)
|
||||
return get_step(center,SOUTH)
|
||||
if(9)
|
||||
return get_step(center,SOUTHEAST)
|
||||
|
||||
/obj/effect/sliding_puzzle/Initialize(mapload)
|
||||
..()
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
/obj/effect/sliding_puzzle/LateInitialize()
|
||||
if(auto_setup)
|
||||
setup()
|
||||
|
||||
/obj/effect/sliding_puzzle/proc/check_setup_location()
|
||||
for(var/id in 1 to 9)
|
||||
var/turf/T = get_turf_for_id(id)
|
||||
if(!T)
|
||||
return FALSE
|
||||
if(istype(T, /turf/simulated/wall/indestructible) || istype(T, /turf/simulated/floor/indestructible))
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
|
||||
/obj/effect/sliding_puzzle/proc/validate()
|
||||
if(finished)
|
||||
return
|
||||
|
||||
if(elements.len < 8) //Someone broke it
|
||||
qdel(src)
|
||||
|
||||
//Check if everything is in place
|
||||
for(var/id in 1 to 9)
|
||||
var/target_turf = get_turf_for_id(id)
|
||||
var/obj/structure/puzzle_element/E = locate() in target_turf
|
||||
if(id == empty_tile_id && !E) // This location should be empty.
|
||||
continue
|
||||
if(!E || E.id != id) //wrong tile or no tile at all
|
||||
return
|
||||
//Ding ding
|
||||
finish()
|
||||
|
||||
/obj/effect/sliding_puzzle/Destroy()
|
||||
if(LAZYLEN(elements))
|
||||
for(var/obj/structure/puzzle_element/E in elements)
|
||||
E.source = null
|
||||
elements.Cut()
|
||||
return ..()
|
||||
|
||||
#define COLLAPSE_DURATION 7
|
||||
|
||||
/obj/effect/sliding_puzzle/proc/finish()
|
||||
finished = TRUE
|
||||
for(var/mob/M in range(7,src))
|
||||
shake_camera(M, COLLAPSE_DURATION , 1)
|
||||
for(var/obj/structure/puzzle_element/E in elements)
|
||||
E.collapse()
|
||||
|
||||
dispense_reward()
|
||||
|
||||
/obj/effect/sliding_puzzle/proc/dispense_reward()
|
||||
new reward_type(get_turf(src))
|
||||
|
||||
/obj/effect/sliding_puzzle/proc/is_solvable()
|
||||
var/list/current_ordering = list()
|
||||
for(var/obj/structure/puzzle_element/E in elements_in_order())
|
||||
current_ordering += E.id
|
||||
|
||||
var/swap_tally = 0
|
||||
for(var/i in 1 to current_ordering.len)
|
||||
var/checked_value = current_ordering[i]
|
||||
for(var/j in i to current_ordering.len)
|
||||
if(current_ordering[j] < checked_value)
|
||||
swap_tally++
|
||||
|
||||
return swap_tally % 2 == 0
|
||||
|
||||
//swap two tiles in same row
|
||||
/obj/effect/sliding_puzzle/proc/make_solvable()
|
||||
var/first_tile_id = 1
|
||||
var/other_tile_id = 2
|
||||
if(empty_tile_id == 1 || empty_tile_id == 2) //Can't swap with empty one so just grab some in second row
|
||||
first_tile_id = 4
|
||||
other_tile_id = 5
|
||||
|
||||
var/turf/T1 = get_turf_for_id(first_tile_id)
|
||||
var/turf/T2 = get_turf_for_id(other_tile_id)
|
||||
|
||||
var/obj/structure/puzzle_element/E1 = locate() in T1
|
||||
var/obj/structure/puzzle_element/E2 = locate() in T2
|
||||
|
||||
E1.forceMove(T2)
|
||||
E2.forceMove(T1)
|
||||
|
||||
/proc/cmp_xy_desc(atom/movable/A, atom/movable/B)
|
||||
if(A.y > B.y)
|
||||
return -1
|
||||
if(A.y < B.y)
|
||||
return 1
|
||||
if(A.x > B.x)
|
||||
return 1
|
||||
if(A.x < B.x)
|
||||
return -1
|
||||
return 0
|
||||
|
||||
/obj/effect/sliding_puzzle/proc/elements_in_order()
|
||||
return sortTim(elements,cmp=/proc/cmp_xy_desc)
|
||||
|
||||
/obj/effect/sliding_puzzle/proc/get_base_icon()
|
||||
var/icon/I = new('icons/obj/puzzle.dmi')
|
||||
var/list/puzzles = icon_states(I)
|
||||
var/puzzle_state = pick(puzzles)
|
||||
var/icon/P = new('icons/obj/puzzle.dmi',puzzle_state)
|
||||
return P
|
||||
|
||||
/obj/effect/sliding_puzzle/proc/setup()
|
||||
//First we slice the 96x96 icon into 32x32 pieces
|
||||
var/list/puzzle_pieces = list() //id -> icon list
|
||||
|
||||
var/width = 3
|
||||
var/height = 3
|
||||
var/list/left_ids = list()
|
||||
var/tile_count = width * height
|
||||
|
||||
//Generate per tile icons
|
||||
for(var/id in 1 to tile_count)
|
||||
var/y = width - round((id - 1) / width)
|
||||
var/x = ((id - 1) % width) + 1
|
||||
|
||||
var/x_start = 1 + (x - 1) * world.icon_size
|
||||
var/x_end = x_start + world.icon_size - 1
|
||||
var/y_start = 1 + ((y - 1) * world.icon_size)
|
||||
var/y_end = y_start + world.icon_size - 1
|
||||
|
||||
var/icon/T = get_base_icon()
|
||||
T.Crop(x_start,y_start,x_end,y_end)
|
||||
puzzle_pieces["[id]"] = T
|
||||
left_ids += id
|
||||
|
||||
//Setup random empty tile
|
||||
empty_tile_id = pick_n_take(left_ids)
|
||||
var/turf/empty_tile_turf = get_turf_for_id(empty_tile_id)
|
||||
empty_tile_turf.ChangeTurf(floor_type, keep_icon = FALSE, ignore_air = FALSE)
|
||||
var/mutable_appearance/MA = new(puzzle_pieces["[empty_tile_id]"])
|
||||
MA.layer = empty_tile_turf.layer + 0.1
|
||||
empty_tile_turf.add_overlay(MA)
|
||||
|
||||
elements = list()
|
||||
var/list/empty_spots = left_ids.Copy()
|
||||
for(var/spot_id in empty_spots)
|
||||
var/turf/T = get_turf_for_id(spot_id)
|
||||
T = T.ChangeTurf(floor_type, keep_icon = FALSE, ignore_air = FALSE)
|
||||
var/obj/structure/puzzle_element/E = new element_type(T)
|
||||
elements += E
|
||||
var/chosen_id = pick_n_take(left_ids)
|
||||
E.puzzle_icon = puzzle_pieces["[chosen_id]"]
|
||||
E.source = src
|
||||
E.id = chosen_id
|
||||
E.set_puzzle_icon()
|
||||
|
||||
if(!is_solvable())
|
||||
make_solvable()
|
||||
|
||||
/obj/structure/puzzle_element
|
||||
name = "mysterious pillar"
|
||||
desc = "puzzling..."
|
||||
icon = 'icons/obj/lavaland/artefacts.dmi'
|
||||
icon_state = "puzzle_pillar"
|
||||
anchored = FALSE
|
||||
density = TRUE
|
||||
var/id = 0
|
||||
var/obj/effect/sliding_puzzle/source
|
||||
var/icon/puzzle_icon
|
||||
|
||||
/obj/structure/puzzle_element/Move(nloc, dir)
|
||||
if(!isturf(nloc) || moving_diagonally || get_dist(get_step(src,dir),get_turf(source)) > 1)
|
||||
return 0
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/puzzle_element/proc/set_puzzle_icon()
|
||||
cut_overlays()
|
||||
if(puzzle_icon)
|
||||
//Need to scale it down a bit to fit the static border
|
||||
var/icon/C = new(puzzle_icon)
|
||||
C.Scale(19,19)
|
||||
var/mutable_appearance/puzzle_small = new(C)
|
||||
puzzle_small.layer = layer + 0.1
|
||||
puzzle_small.pixel_x = 7
|
||||
puzzle_small.pixel_y = 7
|
||||
add_overlay(puzzle_small)
|
||||
|
||||
/obj/structure/puzzle_element/Destroy()
|
||||
if(source)
|
||||
source.elements -= src
|
||||
source.validate()
|
||||
return ..()
|
||||
|
||||
//Set the full image on the turf and delete yourself
|
||||
/obj/structure/puzzle_element/proc/collapse()
|
||||
var/turf/T = get_turf(src)
|
||||
var/mutable_appearance/MA = new(puzzle_icon)
|
||||
MA.layer = T.layer + 0.1
|
||||
T.add_overlay(MA)
|
||||
//Some basic shaking animation
|
||||
for(var/i in 1 to COLLAPSE_DURATION)
|
||||
animate(src, pixel_x=rand(-5,5), pixel_y=rand(-2,2), time=1)
|
||||
QDEL_IN(src,COLLAPSE_DURATION)
|
||||
|
||||
/obj/structure/puzzle_element/Moved()
|
||||
. = ..()
|
||||
source.validate()
|
||||
|
||||
//Admin abuse version so you can pick the icon before it sets up
|
||||
/obj/effect/sliding_puzzle/admin
|
||||
auto_setup = FALSE
|
||||
var/icon/puzzle_icon
|
||||
var/puzzle_state
|
||||
|
||||
/obj/effect/sliding_puzzle/admin/get_base_icon()
|
||||
var/icon/I = new(puzzle_icon,puzzle_state)
|
||||
return I
|
||||
|
||||
//Ruin version
|
||||
/obj/effect/sliding_puzzle/lavaland
|
||||
reward_type = /obj/structure/closet/crate/necropolis/puzzle
|
||||
|
||||
/obj/effect/sliding_puzzle/lavaland/dispense_reward()
|
||||
if(prob(25))
|
||||
//If it's not roaming somewhere else already.
|
||||
var/mob/living/simple_animal/hostile/megafauna/bubblegum/B = locate() in GLOB.mob_list
|
||||
if(!B)
|
||||
reward_type = /mob/living/simple_animal/hostile/megafauna/bubblegum
|
||||
return ..()
|
||||
|
||||
//Prison cube version
|
||||
/obj/effect/sliding_puzzle/prison
|
||||
auto_setup = FALSE //This will be done by cube proc
|
||||
var/mob/living/prisoner
|
||||
element_type = /obj/structure/puzzle_element/prison
|
||||
|
||||
/obj/effect/sliding_puzzle/prison/get_base_icon()
|
||||
if(!prisoner)
|
||||
CRASH("Prison cube without prisoner")
|
||||
prisoner.setDir(SOUTH)
|
||||
var/icon/I = getFlatIcon(prisoner)
|
||||
I.Scale(96,96)
|
||||
return I
|
||||
|
||||
/obj/effect/sliding_puzzle/prison/Destroy()
|
||||
if(prisoner)
|
||||
to_chat(prisoner,"<span class='userdanger'>With the cube broken by force, you can feel your body falling apart.</span>")
|
||||
prisoner.death()
|
||||
qdel(prisoner)
|
||||
. = ..()
|
||||
|
||||
/obj/effect/sliding_puzzle/prison/dispense_reward()
|
||||
prisoner.forceMove(get_turf(src))
|
||||
prisoner.notransform = FALSE
|
||||
prisoner = null
|
||||
|
||||
//Some armor so it's harder to kill someone by mistake.
|
||||
/obj/structure/puzzle_element/prison
|
||||
armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 50, "rad" = 50, "fire" = 50, "acid" = 50)
|
||||
|
||||
/obj/structure/puzzle_element/prison/relaymove(mob/user)
|
||||
return
|
||||
|
||||
/obj/item/prisoncube
|
||||
name = "Prison Cube"
|
||||
desc = "Dusty cube with humanoid imprint on it."
|
||||
icon = 'icons/obj/lavaland/artefacts.dmi'
|
||||
icon_state = "prison_cube"
|
||||
|
||||
/obj/item/prisoncube/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
|
||||
. = ..()
|
||||
if(!proximity_flag || !isliving(target))
|
||||
return
|
||||
var/mob/living/victim = target
|
||||
var/mob/living/carbon/carbon_victim = victim
|
||||
//Handcuffed or unconcious
|
||||
if(istype(carbon_victim) && carbon_victim.handcuffed || victim.stat != CONSCIOUS)
|
||||
if(!puzzle_imprison(target))
|
||||
to_chat(user,"<span class='warning'>[src] does nothing.</span>")
|
||||
return
|
||||
to_chat(user,"<span class='warning'>You trap [victim] in the prison cube!</span>")
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user,"<span class='notice'>[src] only accepts restrained or unconcious prisoners.</span>")
|
||||
|
||||
/proc/puzzle_imprison(mob/living/prisoner)
|
||||
var/turf/T = get_turf(prisoner)
|
||||
var/obj/effect/sliding_puzzle/prison/cube = new(T)
|
||||
if(!cube.check_setup_location())
|
||||
qdel(cube)
|
||||
return FALSE
|
||||
|
||||
//First grab the prisoner and move them temporarily into the generator so they won't get thrown around.
|
||||
prisoner.notransform = TRUE
|
||||
prisoner.forceMove(cube)
|
||||
to_chat(prisoner,"<span class='userdanger'>You're trapped by the prison cube! You will remain trapped until someone solves it.</span>")
|
||||
|
||||
//Clear the area from objects (and cube user)
|
||||
var/list/things_to_throw = list()
|
||||
for(var/atom/movable/AM in range(1,T))
|
||||
if(!AM.anchored)
|
||||
things_to_throw += AM
|
||||
|
||||
for(var/atom/movable/AM in things_to_throw)
|
||||
var/throwtarget = get_edge_target_turf(T, get_dir(T, get_step_away(AM, T)))
|
||||
AM.throw_at(throwtarget, 2, 3)
|
||||
|
||||
//Create puzzle itself
|
||||
cube.prisoner = prisoner
|
||||
cube.setup()
|
||||
|
||||
//Move them into random block
|
||||
var/obj/structure/puzzle_element/E = pick(cube.elements)
|
||||
prisoner.forceMove(E)
|
||||
return TRUE
|
||||
@@ -0,0 +1,156 @@
|
||||
//These objects are used in the cardinal sin-themed ruins (i.e. Gluttony, Pride...)
|
||||
|
||||
// Greed
|
||||
/obj/structure/cursed_slot_machine //Greed's slot machine: Used in the Greed ruin. Deals clone damage on each use, with a successful use giving a d20 of fate.
|
||||
name = "greed's slot machine"
|
||||
desc = "High stakes, high rewards."
|
||||
icon = 'icons/obj/economy.dmi'
|
||||
icon_state = "slots-off"
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
var/win_prob = 5
|
||||
|
||||
/obj/structure/cursed_slot_machine/attack_hand(mob/user)
|
||||
interact(user)
|
||||
|
||||
/obj/structure/cursed_slot_machine/interact(mob/living/carbon/human/user)
|
||||
if(!istype(user))
|
||||
return
|
||||
|
||||
if(in_use)
|
||||
return
|
||||
|
||||
in_use = TRUE
|
||||
user.adjustCloneLoss(20)
|
||||
if(user.stat)
|
||||
to_chat(user, "<span class='userdanger'>No... just one more try...</span>")
|
||||
user.gib()
|
||||
else
|
||||
user.visible_message("<span class='warning'>[user] pulls [src]'s lever with a glint in [user.p_their()] eyes!</span>", "<span class='warning'>You feel a draining as you pull the lever, but you \
|
||||
know it'll be worth it.</span>")
|
||||
icon_state = "slots-on"
|
||||
playsound(src, 'sound/lavaland/cursed_slot_machine.ogg', 50, 0)
|
||||
addtimer(CALLBACK(src, .proc/determine_victor, user), 50)
|
||||
|
||||
/obj/structure/cursed_slot_machine/proc/determine_victor(mob/living/user)
|
||||
icon_state = "slots-off"
|
||||
in_use = FALSE
|
||||
if(prob(win_prob))
|
||||
playsound(src, 'sound/lavaland/cursed_slot_machine_jackpot.ogg', 50, 0)
|
||||
new/obj/structure/cursed_money(get_turf(src))
|
||||
if(user)
|
||||
to_chat(user, "<span class='boldwarning'>You've hit jackpot. Laughter echoes around you as your reward appears in the machine's place.</span>")
|
||||
qdel(src)
|
||||
else
|
||||
if(user)
|
||||
to_chat(user, "<span class='boldwarning'>Fucking machine! Must be rigged. Still... one more try couldn't hurt, right?</span>")
|
||||
|
||||
/obj/structure/cursed_money
|
||||
name = "bag of money"
|
||||
desc = "RICH! YES! YOU KNEW IT WAS WORTH IT! YOU'RE RICH! RICH! RICH!"
|
||||
icon = 'icons/obj/storage.dmi'
|
||||
icon_state = "moneybag"
|
||||
anchored = FALSE
|
||||
density = TRUE
|
||||
|
||||
/obj/structure/cursed_money/Initialize()
|
||||
. = ..()
|
||||
addtimer(CALLBACK(src, .proc/collapse), 600)
|
||||
|
||||
/obj/structure/cursed_money/proc/collapse()
|
||||
visible_message("<span class='warning'>[src] falls in on itself, \
|
||||
canvas rotting away and contents vanishing.</span>")
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/cursed_money/attack_hand(mob/living/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
return .
|
||||
|
||||
user.visible_message("<span class='warning'>[user] opens the bag and \
|
||||
and removes a die. The bag then vanishes.</span>",
|
||||
"<span class='boldwarning'>You open the bag...!</span>\n\
|
||||
<span class='danger'>And see a bag full of dice. Confused, \
|
||||
you take one... and the bag vanishes.</span>")
|
||||
var/turf/T = get_turf(user)
|
||||
var/obj/item/dice/d20/fate/one_use/critical_fail = new(T)
|
||||
user.put_in_hands(critical_fail)
|
||||
qdel(src)
|
||||
|
||||
// Gluttony
|
||||
/obj/effect/gluttony //Gluttony's wall: Used in the Gluttony ruin. Only lets the overweight through.
|
||||
name = "gluttony's wall"
|
||||
desc = "Only those who truly indulge may pass."
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
icon_state = "blob"
|
||||
icon = 'icons/mob/blob.dmi'
|
||||
color = rgb(145, 150, 0)
|
||||
|
||||
/obj/effect/gluttony/CanPass(atom/movable/mover, turf/target)//So bullets will fly over and stuff.
|
||||
if(ishuman(mover))
|
||||
var/mob/living/carbon/human/H = mover
|
||||
if(H.nutrition >= NUTRITION_LEVEL_FAT || (FAT in H.mutations))
|
||||
H.visible_message("<span class='warning'>[H] pushes through [src]!</span>", "<span class='notice'>You've seen and eaten worse than this.</span>")
|
||||
return TRUE
|
||||
else
|
||||
to_chat(H, "<span class='warning'>You're repulsed by even looking at [src]. Only a pig could force themselves to go through it.</span>")
|
||||
if(istype(mover, /mob/living/simple_animal/hostile/morph))
|
||||
return TRUE
|
||||
else
|
||||
return FALSE
|
||||
|
||||
// Pride
|
||||
/obj/structure/mirror/magic/pride //Pride's mirror: Used in the Pride ruin.
|
||||
name = "pride's mirror"
|
||||
desc = "Pride cometh before the..."
|
||||
icon_state = "magic_mirror"
|
||||
|
||||
/obj/structure/mirror/magic/pride/curse(mob/user)
|
||||
user.visible_message("<span class='danger'><B>The ground splits beneath [user] as [user.p_their()] hand leaves the mirror!</B></span>", \
|
||||
"<span class='notice'>Perfect. Much better! Now <i>nobody</i> will be able to resist yo-</span>")
|
||||
|
||||
var/turf/T = get_turf(user)
|
||||
var/list/levels = space_manager.z_list.Copy()
|
||||
for(var/level in levels)
|
||||
if(!is_teleport_allowed(level))
|
||||
levels -= level
|
||||
|
||||
T.ChangeTurf(/turf/simulated/floor/chasm)
|
||||
var/turf/simulated/floor/chasm/C = T
|
||||
C.drop_x = T.x
|
||||
C.drop_y = T.y
|
||||
C.drop_z = pick(levels)
|
||||
C.drop(user)
|
||||
|
||||
// Envy
|
||||
/obj/item/kitchen/knife/envy //Envy's knife: Found in the Envy ruin. Attackers take on the appearance of whoever they strike.
|
||||
name = "envy's knife"
|
||||
desc = "Their success will be yours."
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
icon_state = "render"
|
||||
item_state = "knife"
|
||||
force = 18
|
||||
throwforce = 10
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
|
||||
/obj/item/kitchen/knife/envy/afterattack(atom/movable/AM, mob/living/carbon/human/user, proximity)
|
||||
. = ..()
|
||||
if(!proximity)
|
||||
return
|
||||
if(!istype(user))
|
||||
return
|
||||
if(ishuman(AM))
|
||||
var/mob/living/carbon/human/H = AM
|
||||
if(user.real_name != H.dna.real_name)
|
||||
user.real_name = H.dna.real_name
|
||||
H.dna.transfer_identity(user)
|
||||
user.visible_message("<span class='warning'>[user]'s appearance shifts into [H]'s!</span>", \
|
||||
"<span class='boldannounce'>[H.p_they(TRUE)] think[H.p_s()] [H.p_theyre()] <i>sooo</i> much better than you. Not anymore, [H.p_they()] won't.</span>")
|
||||
|
||||
// Sloth
|
||||
/obj/item/paper/fluff/stations/lavaland/sloth/note
|
||||
name = "note from sloth"
|
||||
icon_state = "paper_words"
|
||||
info = "have not gotten around to finishing my cursed item yet sorry - sloth"
|
||||
Reference in New Issue
Block a user