mirror of
https://github.com/goonstation/goonstation-2016.git
synced 2026-07-10 00:22:22 +01:00
dc4217b498
this is all very alpha please don't hate me too much if i fucked it up
1659 lines
50 KiB
Plaintext
1659 lines
50 KiB
Plaintext
//CONTENTS
|
|
//Meaty areas
|
|
//Stomach acid turf & such
|
|
//Meat lights. Not to be confused with Spam Lite reduced fat meat-like protein product.
|
|
//Grumpy meat-infested monster doors, monster floors, mutant cosmonauts, and a very sad giant head.
|
|
//Various log files.
|
|
//Audio logs
|
|
//Fancy items in the land of meat
|
|
//Puzzle elements
|
|
//Gross mutant limbs
|
|
|
|
|
|
/*
|
|
meaty thoughts from cogwerks to his spacepal aibm:
|
|
- meat lights oughta blink more slowly but set luminosity off and on when they do, slowly flickering lights are scary
|
|
- those grotesquerie things that look like they have mouths should be a subset of the martian crevice code OK
|
|
- and should occasionally devour arms and/or puke up acid into the face of whoever digs around in there
|
|
- acid pits could use more sound / user feedback / screaming / hissing / facemelting / usr << OH GOD IT STINGS sorta stuff OK YES
|
|
- add a subtype of landmines that look like a gib pile and just hideously burst (into blood fog???? or just gibs) when stepped on DONE
|
|
- add a horrible distorted wet gurgly scream for the cosmonauts when they attack DONE
|
|
*/
|
|
|
|
/obj/crevice/meatland
|
|
name = "macabre grotesquerie"
|
|
density = 1
|
|
desc = "It keeps pulsing. Ew. Probably shouldn't put your hand in the..mouth?"
|
|
icon = 'icons/misc/meatland.dmi'
|
|
icon_state = "meatlumps"
|
|
dir = 4
|
|
|
|
var/list/meatland_fx_sounds = list('sound/ambience/meatzone_fx1.ogg','sound/ambience/meatzone_fx2.ogg','sound/ambience/meatzone_fx3.ogg','sound/ambience/meatzone_fx4.ogg')
|
|
|
|
/area/meat_derelict
|
|
icon_state = "red"
|
|
RL_Lighting = 1
|
|
|
|
var/sound/ambientSound = 'sound/ambience/meatzone_amb_slow.ogg'
|
|
var/list/fxlist = null
|
|
var/list/soundSubscribers = null
|
|
var/use_alarm = 0
|
|
|
|
New()
|
|
..()
|
|
fxlist = meatland_fx_sounds
|
|
if (ambientSound)
|
|
|
|
spawn (60)
|
|
var/sound/S = new/sound()
|
|
S.file = ambientSound
|
|
S.repeat = 0
|
|
S.wait = 0
|
|
S.channel = 123
|
|
S.volume = 60
|
|
S.priority = 255
|
|
S.status = SOUND_UPDATE
|
|
ambientSound = S
|
|
|
|
soundSubscribers = list()
|
|
process()
|
|
|
|
Entered(atom/movable/Obj,atom/OldLoc)
|
|
..()
|
|
if(ambientSound && ismob(Obj))
|
|
if (!soundSubscribers:Find(Obj))
|
|
soundSubscribers += Obj
|
|
|
|
return
|
|
|
|
proc/process()
|
|
if (!soundSubscribers)
|
|
return
|
|
|
|
var/sound/S = null
|
|
var/sound_delay = 0
|
|
|
|
|
|
while(ticker && ticker.current_state < GAME_STATE_FINISHED)
|
|
sleep(60)
|
|
|
|
if(prob(10) && fxlist)
|
|
S = sound(file=pick(fxlist), volume=50)
|
|
sound_delay = rand(0, 50)
|
|
else
|
|
S = null
|
|
continue
|
|
|
|
for(var/mob/living/H in soundSubscribers)
|
|
var/area/mobArea = get_area(H)
|
|
if (!istype(mobArea) || mobArea.type != src.type)
|
|
soundSubscribers -= H
|
|
if (H.client)
|
|
ambientSound.status = SOUND_PAUSED | SOUND_UPDATE
|
|
ambientSound.volume = 0
|
|
H << ambientSound
|
|
continue
|
|
|
|
if(H.client)
|
|
ambientSound.status = SOUND_UPDATE
|
|
ambientSound.volume = 60
|
|
H << ambientSound
|
|
if(S)
|
|
spawn(sound_delay)
|
|
H << S
|
|
|
|
/area/meat_derelict/entry
|
|
name = "Teleportation Lab"
|
|
icon_state = "telelab"
|
|
|
|
/area/meat_derelict/main
|
|
name = "Primary corridor"
|
|
|
|
/area/meat_derelict/guts
|
|
name = "The Guts"
|
|
icon_state = "green"
|
|
|
|
/area/meat_derelict/soviet
|
|
name = "Samostrel patrol craft"
|
|
icon_state = "purple"
|
|
ambientSound = 'sound/ambience/meatzone_amb_soviet.ogg'
|
|
|
|
/area/meat_derelict/boss
|
|
name = "The Heart"
|
|
icon_state = "security"
|
|
ambientSound = 'sound/ambience/meatzone_amb_fast.ogg'
|
|
irradiated = 0.1
|
|
|
|
|
|
/turf/unsimulated/floor/setpieces/bloodfloor/stomach
|
|
name = "acid"
|
|
density = 0
|
|
desc = "A pool of stomach acid. Lovely."
|
|
icon = 'icons/misc/meatland.dmi'
|
|
icon_state = "acid_floor"
|
|
New()
|
|
..()
|
|
dir = pick(NORTH,SOUTH)
|
|
|
|
/obj/stomachacid
|
|
name = "acid"
|
|
density = 0
|
|
anchored = 1
|
|
icon = 'icons/misc/meatland.dmi'
|
|
icon_state = "acid_depth"
|
|
layer = EFFECTS_LAYER_UNDER_1
|
|
mouse_opacity = 0
|
|
New()
|
|
..()
|
|
var/datum/reagents/R = new/datum/reagents(25)
|
|
reagents = R
|
|
R.my_atom = src
|
|
R.add_reagent("acid",20)
|
|
R.add_reagent("vomit",5)
|
|
|
|
HasEntered(atom/A)
|
|
reagents.reaction(A, TOUCH, 2)
|
|
if (prob(50) && istype(A, /mob/living))
|
|
boutput(A, pick("<span style=\"color:red\">This stings!</span>", "<span style=\"color:red\">Oh jesus this burns!!</span>", "<span style=\"color:red\">ow ow OW OW OW OW</span>", "<span style=\"color:red\">oh cripes this isn't the fun kind of acid</span>", "<span style=\"color:red\">ow OW OUCH FUCK OW</span>"))
|
|
if (ishuman(A) && prob(80))
|
|
A:emote("scream")
|
|
return
|
|
|
|
/obj/meatlight
|
|
name = "luminous lumplette"
|
|
desc = "The masons inscribed the all-seeing eye of providence on the dollar bill as part of a great conspiracy. Ha ha, nah, I'm lying. The symbol was added years before the masons started using it by an artist who probably just thought it looked cool. Anyway, this sure is a gross blobby thing, ain't it?"
|
|
icon = 'icons/misc/meatland.dmi'
|
|
icon_state = "light"
|
|
anchored = 1
|
|
density = 1
|
|
var/health = 10
|
|
var/alive = 1
|
|
var/brightness = 3
|
|
var/datum/light/light
|
|
|
|
New()
|
|
..()
|
|
light = new /datum/light/point
|
|
light.attach(src)
|
|
light.set_color(0.87, 0.937, 0.42)
|
|
light.set_brightness(src.brightness / 5)
|
|
light.enable()
|
|
|
|
attackby(obj/item/O as obj, mob/user as mob)
|
|
if (src.alive && O.force)
|
|
src.health -= O.force / 4
|
|
src.visible_message("<span style=\"color:red\"><b>[user] bops [src] with [O]!</b></span>")
|
|
if (src.health <= 0)
|
|
src.alive = 0
|
|
src.visible_message("<span style=\"color:red\"><b>[src]</b> dies!</span>")
|
|
src.icon_state = "light-dead"
|
|
light.disable()
|
|
|
|
else
|
|
..()
|
|
|
|
/obj/critter/monster_door
|
|
name = "airlock"
|
|
icon = 'icons/misc/meatland.dmi'
|
|
icon_state = "eatdoor"
|
|
desc = "A hydraulic door capable of withstanding multiple atmospheres of pressure. Oh, except this one. This one is all broken and covered in blood."
|
|
wanderer = 0
|
|
opacity = 1
|
|
anchored = 1
|
|
seekrange = 1
|
|
attack_range = 1
|
|
butcherable = 0
|
|
density = 1
|
|
aggressive = 1
|
|
atkcarbon = 1
|
|
atksilicon = 1
|
|
health = 40
|
|
brutevuln = 0.6
|
|
firevuln = 0.15
|
|
angertext = "bares jagged fangs at"
|
|
generic = 0
|
|
|
|
|
|
floor
|
|
name = "floor"
|
|
desc = ""
|
|
icon_state = "eatfloor"
|
|
attack_range = 0
|
|
density = 0
|
|
opacity = 0
|
|
layer = FLOOR_EQUIP_LAYER1
|
|
|
|
New()
|
|
..()
|
|
if (src.loc)
|
|
src.loc.invisibility = 100 //Hide the floor below us so people don't just right click and see two floors.
|
|
|
|
attackby(obj/item/O as obj, mob/user as mob)
|
|
if (src.alive && istype(O, /obj/item/crowbar))
|
|
user.visible_message("<span style=\"color:red\"><b>[user] jabs [src] with [O]!</b></span>", "<span style=\"color:red\">You jab [src] with [O] and begin to pull! Hold on!</span>")
|
|
if (do_after(user, 20))
|
|
playsound(src.loc, "sound/items/Crowbar.ogg", 50, 1)
|
|
gibs(src.loc)
|
|
if (src.loc)
|
|
new /obj/item/tile/steel (src.loc)
|
|
src.loc.invisibility = 0
|
|
|
|
qdel(src)
|
|
return
|
|
|
|
else
|
|
return ..()
|
|
|
|
attack_hand(mob/user as mob)
|
|
if (src.alive)
|
|
if (!attacking)
|
|
return ai_think()
|
|
|
|
else if(aggressive && user.a_intent == "help")
|
|
return
|
|
|
|
return ..()
|
|
|
|
CritterAttack(mob/M)
|
|
if(ismob(M))
|
|
src.attacking = 1
|
|
src.visible_message("<span style=\"color:red\"><B>[src]</B> chomps down on [M]!</span>")
|
|
playsound(src.loc, "sound/effects/fleshbr1.ogg", 50, 1)
|
|
random_brute_damage(M, rand(10,35))
|
|
spawn(10)
|
|
src.attacking = 0
|
|
|
|
ai_think()
|
|
if(task == "chasing")
|
|
if (src.frustration >= 8)
|
|
src.target = null
|
|
src.last_found = world.time
|
|
src.frustration = 0
|
|
src.task = "thinking"
|
|
|
|
src.icon_state = "[initial(src.icon_state)]-attack"
|
|
src.opacity = 0
|
|
if (target)
|
|
if (get_dist(src, src.target) <= src.attack_range)
|
|
var/mob/living/carbon/M = src.target
|
|
if (M)
|
|
CritterAttack(M)
|
|
src.task = "attacking"
|
|
src.anchored = 1
|
|
src.target_lastloc = M.loc
|
|
else
|
|
if ((get_dist(src, src.target)) >= src.attack_range)
|
|
src.frustration++
|
|
else
|
|
src.frustration = 0
|
|
else
|
|
src.task = "thinking"
|
|
else if (task == "attacking")
|
|
src.icon_state = "[initial(src.icon_state)]-attack"
|
|
src.opacity = 0
|
|
return ..()
|
|
else
|
|
src.icon_state = initial(src.icon_state)
|
|
src.opacity = initial(src.opacity)
|
|
return ..()
|
|
|
|
proc/update_meat_head_dialog(var/new_text)
|
|
if (!new_text || !length(ckey(new_text)) || !main_meat_head)
|
|
return
|
|
|
|
main_meat_head.update_meat_head_dialog(new_text)
|
|
|
|
var/global/obj/critter/monster_door/main_meat_head = null
|
|
var/global/list/default_meat_head_dialog = list("hello hello", "... it's not viral, it's some kind of ... stress ... hello", "what is that ...", "... hurts ...",
|
|
"...FACILITY IS ON RED ALERT...","...why...","...proper safety precautions were not....","...is it...", "...this isn't...")
|
|
|
|
#define MEATHEAD_MAX_CUSTOM_UTTERANCES 32
|
|
|
|
/obj/critter/monster_door/meat_head //Clash at Meathead
|
|
name = "Something"
|
|
desc = "jesus fuck"
|
|
density = 1
|
|
defensive = 1
|
|
opacity = 0
|
|
anchored = 1
|
|
aggressive = 0
|
|
health = 4000
|
|
icon = 'icons/effects/64x64.dmi'
|
|
icon_state = "meatboss_sad"
|
|
bound_height = 64
|
|
bound_width = 64
|
|
angertext = "shakes and wobbles furiously at"
|
|
var/list/dialog = list()
|
|
var/obj/item/clothing/head/hat = null
|
|
var/static/list/meathead_noises = list('sound/misc/meat_gargle.ogg', 'sound/misc/meat_hork.ogg', 'sound/misc/meat_plop.ogg', 'sound/misc/meat_splat.ogg')
|
|
|
|
New()
|
|
..()
|
|
if (default_meat_head_dialog)
|
|
dialog += default_meat_head_dialog.Copy()
|
|
|
|
spawn (20)
|
|
if (!main_meat_head)
|
|
main_meat_head = src
|
|
|
|
CritterDeath()
|
|
if (!src.alive) return
|
|
src.icon_state = "meatboss_dead"
|
|
src.alive = 0
|
|
src.anchored = 1
|
|
walk_to(src,0)
|
|
src.visible_message("<b>[src]</b> dies!")
|
|
|
|
|
|
ai_think()
|
|
if(task == "chasing")
|
|
if (src.frustration >= 4)
|
|
src.target = null
|
|
src.last_found = world.time
|
|
src.frustration = 0
|
|
src.task = "thinking"
|
|
|
|
src.icon_state = "[initial(src.icon_state)]-attack"
|
|
src.opacity = 0
|
|
if (target)
|
|
if(prob(30))
|
|
playsound(src.loc, pick(meathead_noises), 40, 1)
|
|
if (get_dist(src, src.target) <= src.attack_range)
|
|
var/mob/living/carbon/M = src.target
|
|
if (M)
|
|
CritterAttack(M)
|
|
src.task = "attacking"
|
|
src.anchored = 1
|
|
src.target_lastloc = M.loc
|
|
else
|
|
if ((get_dist(src, src.target)) >= src.attack_range)
|
|
src.frustration++
|
|
else
|
|
src.frustration = 0
|
|
else
|
|
src.task = "thinking"
|
|
else if (task == "chasing")
|
|
src.icon_state = "[initial(src.icon_state)]-attack"
|
|
return ..()
|
|
else
|
|
src.icon_state = initial(src.icon_state)
|
|
if (prob(10) && dialog && dialog.len)
|
|
speak(pick(dialog))
|
|
return ..()
|
|
|
|
CritterAttack(mob/M)
|
|
if (!ismob(M))
|
|
return
|
|
|
|
src.attacking = 1
|
|
src.visible_message("<span style=\"color:red\">[src] slaps [M] with a meaty tendril!</span>")
|
|
playsound(src.loc, "sound/effects/snap.ogg", 50, 1)
|
|
M.weakened += 10
|
|
random_brute_damage(M, 10)
|
|
M.throw_at(get_edge_target_turf(M, get_dir(src, get_step_away(M, src))), 200, 4)
|
|
|
|
src.target = null
|
|
src.last_found = world.time
|
|
src.frustration = 0
|
|
src.task = "thinking"
|
|
|
|
spawn(30)
|
|
src.attacking = 0
|
|
|
|
update_meat_head_dialog(var/message)
|
|
if (!message)
|
|
return 1
|
|
|
|
. = ckey(message)
|
|
for (var/test_string in dialog)
|
|
if (. == ckey(test_string))
|
|
return 1
|
|
|
|
var/list/exploded_sentence = splittext(message, " ")
|
|
if (!exploded_sentence || !exploded_sentence.len)
|
|
return 1
|
|
|
|
if (exploded_sentence.len > 1)
|
|
if (prob(50))
|
|
exploded_sentence.Cut( rand(1, round(exploded_sentence.len / 2)))
|
|
exploded_sentence.len = max(5, exploded_sentence.len - rand(1,4))
|
|
|
|
else
|
|
for (var/i = 1, i <= exploded_sentence.len, i++)
|
|
if (prob(10))
|
|
exploded_sentence[i] = "..."
|
|
|
|
. = jointext(exploded_sentence, " ")
|
|
dialog += .
|
|
|
|
if ((dialog.len - default_meat_head_dialog.len) > MEATHEAD_MAX_CUSTOM_UTTERANCES)
|
|
dialog.Cut(MEATHEAD_MAX_CUSTOM_UTTERANCES, MEATHEAD_MAX_CUSTOM_UTTERANCES+1)
|
|
|
|
return 0
|
|
|
|
hear_talk(var/mob/living/carbon/speaker, messages, real_name, lang_id)
|
|
if (prob(20))
|
|
update_meat_head_dialog(messages[1])
|
|
|
|
return
|
|
|
|
attackby(obj/item/O as obj, mob/user as mob)
|
|
if (istype(O, /obj/item/clothing/head))
|
|
user.visible_message("[user] tosses [O] onto [src]!", "You toss [O] onto [src].")
|
|
|
|
user.drop_item()
|
|
O.set_loc( user.loc )
|
|
|
|
O.layer = src.layer+0.1
|
|
animate(O, pixel_x = 11 + (16 * (src.x - O.x)), pixel_y = (32 * (1 + src.y - O.y)), time = 2, loop = 1, easing = SINE_EASING)
|
|
animate(pixel_x = 11 + (32 * (src.x - O.x)), pixel_y = (32 * (src.y - O.y)) + 45, time = 3, loop = 1, easing = SINE_EASING)
|
|
|
|
spawn (10)
|
|
if (O)
|
|
O.set_loc( src )
|
|
O.pixel_x = 11
|
|
O.pixel_y = 45
|
|
src.overlays += O
|
|
if (src.hat)
|
|
src.hat.set_loc( src.loc )
|
|
src.overlays -= src.hat
|
|
animate(src.hat, pixel_x = 13, pixel_y = 27, transform = matrix(180, MATRIX_ROTATE), time = 2, loop = 1, easing = SINE_EASING)
|
|
animate(pixel_x = 0, pixel_y = 0, transform = null, time = 30, loop = 3, easing = SINE_EASING)
|
|
var/obj/item/clothing/head/old_hat = src.hat
|
|
spawn (5)
|
|
if (old_hat)
|
|
old_hat.layer = initial(old_hat.layer)
|
|
|
|
src.hat = O
|
|
|
|
else
|
|
return ..()
|
|
|
|
proc/speak(var/message)
|
|
if(!src.alive || !message)
|
|
return
|
|
|
|
flick("meatboss_chatter", src)
|
|
playsound(src.loc, pick(meathead_noises), 40, 1)
|
|
|
|
for(var/mob/O in hearers(src, null)) //Todo: gnarly font of some sort
|
|
O.show_message("<span class='game say'><span class='name'>[src]</span> [prob(33) ? "mutters" : (prob(50) ? "gurgles" : "whimpers")], \"[message]\"",2)
|
|
return
|
|
|
|
#undef MEATHEAD_MAX_CUSTOM_UTTERANCES
|
|
|
|
/obj/critter/blobman/meaty_martha
|
|
generic = 0
|
|
|
|
New()
|
|
..()
|
|
src.name = "[pick("grody", "clotty", "greasy", "meaty", "fleshy", "vile", "chunky", "putrid")] [pick("nugget", "bloblet", "pustule", "corpuscle", "viscera")]"
|
|
src.icon_state = pick("meaty_mouth", "polyp", "goop")
|
|
|
|
ChaseAttack(mob/M)
|
|
. = target_missing_limb(M)
|
|
if (. == "r_arm" || . == "l_arm" && M:limbs)
|
|
src.visible_message("<span style=\"color:red\"><b>[src] latches onto [M]'s stump!!</b></span>")
|
|
boutput(M, "<span style=\"color:red\">OH FUCK OH FUCK GET IT OFF GET IT OFF IT STINGS</span>")
|
|
playsound(src.loc, "sound/effects/fleshbr1.ogg", 50, 1)
|
|
M.emote("scream")
|
|
M.stunned += rand(1,5)
|
|
random_brute_damage(M, 3)
|
|
switch (.)
|
|
if ("r_arm")
|
|
var/obj/item/parts/human_parts/meat_mutant/part = new /obj/item/parts/human_parts/meat_mutant/arm/right {remove_stage = 2;} (M)
|
|
M:limbs.vars["r_arm"] = part
|
|
part.holder = M
|
|
|
|
if ("l_arm")
|
|
var/obj/item/parts/human_parts/meat_mutant/part = new /obj/item/parts/human_parts/meat_mutant/arm/left {remove_stage = 2;} (M)
|
|
M:limbs.vars["l_arm"] = part
|
|
part.holder = M
|
|
|
|
M:update_body()
|
|
M:update_clothing()
|
|
M:unlock_medal("My Bologna Has A First Name",1)
|
|
qdel(src)
|
|
|
|
else
|
|
src.visible_message("<span style=\"color:red\"><B>[src]</B> smacks against [M]!</span>")
|
|
src.set_loc(M.loc)
|
|
playsound(src.loc, "sound/effects/fleshbr1.ogg", 50, 1)
|
|
if(iscarbon(M))
|
|
if (prob(25))
|
|
M.weakened = max(M.weakened, 1)
|
|
random_brute_damage(M, rand(2,5))
|
|
|
|
CritterDeath()
|
|
if (!src.alive) return
|
|
src.visible_message("<b>[src]</b> collapses into viscera...")
|
|
if (src.loc)
|
|
gibs(src.loc)
|
|
qdel(src)
|
|
|
|
proc/update_meat_head_dialog(var/new_text)
|
|
if (!new_text || !length(ckey(new_text)) || !main_meat_head)
|
|
return
|
|
|
|
main_meat_head.update_meat_head_dialog(new_text)
|
|
|
|
proc/target_missing_limb(mob/living/carbon/human/testhuman)
|
|
if (!istype(testhuman) || !testhuman.limbs)
|
|
return null
|
|
|
|
if (!testhuman.limbs.l_arm)
|
|
return "l_arm"
|
|
else if (!testhuman.limbs.r_arm)
|
|
return "r_arm"
|
|
else if (!testhuman.limbs.r_leg)
|
|
return "r_leg"
|
|
else if (!testhuman.limbs.l_leg)
|
|
return "l_leg"
|
|
|
|
return null
|
|
|
|
/obj/critter/zombie/meatmonaut
|
|
name = "Lost Cosmonaut"
|
|
desc = "Soviet presence near NT stations is rarely overt. For good reasons, as this fellow probably learned too late. Seriously, where is his face? Grody."
|
|
icon = 'icons/misc/meatland.dmi'
|
|
icon_state = "sovmeat"
|
|
health = 26
|
|
brutevuln = 0.6
|
|
atcritter = 0
|
|
eats_brains = 0
|
|
generic = 0
|
|
|
|
ChaseAttack(mob/M)
|
|
if(!attacking)
|
|
src.CritterAttack(M)
|
|
return
|
|
|
|
CritterAttack(mob/M)
|
|
if (prob(20))
|
|
playsound(src.loc, "sound/misc/meatmonaut1.ogg", 50, 0)
|
|
return ..()
|
|
|
|
/obj/item/disk/data/fixed_disk/meatland
|
|
|
|
New()
|
|
..()
|
|
|
|
var/datum/computer/folder/newfolder = new /datum/computer/folder( )
|
|
newfolder.name = "logs"
|
|
src.root.add_file( newfolder )
|
|
newfolder.add_file( new /datum/computer/file/record/c3help(src))
|
|
|
|
newfolder = new /datum/computer/folder
|
|
newfolder.name = "bin"
|
|
src.root.add_file( newfolder )
|
|
newfolder.add_file( new /datum/computer/file/terminal_program/writewizard(src))
|
|
|
|
newfolder = new /datum/computer/folder
|
|
newfolder.name = "doc"
|
|
src.root.add_file( newfolder )
|
|
newfolder.add_file( new /datum/computer/file/record/meatland/clueless (src))
|
|
newfolder.add_file( new /datum/computer/file/record/iomoon_corrupt {name = "log_00000000";} (src))
|
|
newfolder.add_file( new /datum/computer/file/record/meatland/solarium_ha_ha_ha (src))
|
|
newfolder.add_file( new /datum/computer/file/record/iomoon_corrupt {name = "log_aaaaaaa";} (src))
|
|
newfolder.add_file( new /datum/computer/file/record/meatland/technobabble_bs (src))
|
|
newfolder.add_file( new /datum/computer/file/record/meatland/david_is_dead (src))
|
|
|
|
/obj/item/disk/data/fixed_disk/meatland_medical
|
|
|
|
New()
|
|
..()
|
|
|
|
var/datum/computer/folder/newfolder = new /datum/computer/folder( )
|
|
newfolder.name = "logs"
|
|
src.root.add_file( newfolder )
|
|
newfolder.add_file( new /datum/computer/file/record/c3help(src))
|
|
|
|
newfolder = new /datum/computer/folder
|
|
newfolder.name = "bin"
|
|
src.root.add_file( newfolder )
|
|
newfolder.add_file( new /datum/computer/file/terminal_program/writewizard(src))
|
|
|
|
newfolder = new /datum/computer/folder
|
|
newfolder.name = "doc"
|
|
src.root.add_file( newfolder )
|
|
newfolder.add_file( new /datum/computer/file/record/meatland/whiskerdeath0 (src))
|
|
newfolder.add_file( new /datum/computer/file/record/iomoon_corrupt {name = "MEDLOG08";} (src))
|
|
newfolder.add_file( new /datum/computer/file/record/meatland/whiskerdeath1 (src))
|
|
|
|
/obj/machinery/computer3/generic/personal/meatland
|
|
setup_drive_type = /obj/item/disk/data/fixed_disk/meatland
|
|
|
|
/obj/machinery/computer3/generic/personal/meatland_medical
|
|
setup_drive_type = /obj/item/disk/data/fixed_disk/meatland_medical
|
|
|
|
//Computer logs
|
|
/datum/computer/file/record/meatland
|
|
|
|
clueless
|
|
name = "log_20510321"
|
|
|
|
New()
|
|
fields = strings("meatland/meatland_records.txt","log_20510321")
|
|
/*list("Even with the recent acquisition of Hemera",
|
|
"technical documents and some working material,",
|
|
"I cannot help but feel as though we aren't",
|
|
"any closer to a functional teleportation system",
|
|
"than we were months ago. There is a fundamental",
|
|
"gulf in understanding here. They have extensively",
|
|
"and finely shaped the telecrystals; there are",
|
|
"detailed patterns over nearly the entire surface",
|
|
"of the crystal, with individual lines only a few",
|
|
"nanometers thick. We might as well be cavemen",
|
|
"trying to understand a microprocessor.")*/
|
|
|
|
solarium_ha_ha_ha
|
|
name = "log_20510324"
|
|
|
|
New()
|
|
fields = strings("meatland/meatland_records.txt","log_20510324")
|
|
/*list("The patterns on the acquired telecrystal core",
|
|
"perplex me more the more I look at them, not less.",
|
|
"",
|
|
"After examining a section of them, Garret made a",
|
|
"discovery that I find unnerving: the patterns",
|
|
"contain symbols that he has identified as cuneiform",
|
|
"script. I thought Hemera's mythology gimmick was",
|
|
"Greek, why are they putting Sumerian text on this?",
|
|
"Moreover, the symbols don't look to be aesthetic.")*/
|
|
|
|
david_is_dead
|
|
name = "mail_20510415"
|
|
|
|
New()
|
|
fields = strings("meatland/meatland_records.txt","mail_20510415")
|
|
|
|
/*list("Dear Research Staff,",
|
|
"It is with great sadness that we share the loss of junior lab technician David Weller.",
|
|
"Weller activated the research pad without authorization and is assumed deceased.",
|
|
"The reason for his actions is unknown.",
|
|
"Weller was a valuable member of the lab family and will be missed.",
|
|
"Funeral services will be held on the 25th in the main conference room",
|
|
"",
|
|
"Department Head Wilson Kay")*/
|
|
|
|
whiskerdeath0
|
|
name = "MEDLOG07"
|
|
|
|
New()
|
|
fields = strings("meatland/meatland_records.txt","MEDLOG07")
|
|
/*list("The degradation effect has continued to",
|
|
"affect everything sent through the pad, organic or",
|
|
"not. I suspect that it is some kind of residual",
|
|
"stress, a form inherent to the translocation",
|
|
"process. This is the first time anything has",
|
|
"been moved this way, forced directly between",
|
|
"points with no regard for time or distance.",
|
|
"Perhaps the universe takes a dim view of our work.")*/
|
|
|
|
whiskerdeath1
|
|
name = "MEDLOG09"
|
|
|
|
New()
|
|
fields = strings("meatland/meatland_records.txt","MEDLOG09")
|
|
/*list("Patient's condition has continued to worsen. Same",
|
|
"way as the others. Body continues to splinter.",
|
|
"Looks like tiny hairs in random patches, but are",
|
|
"present inside body as well, even through organs or",
|
|
"bone. No causative agent has been discovered. We",
|
|
"have been reduced to providing palliative care.")*/
|
|
|
|
technobabble_bs
|
|
name = "system_brief"
|
|
|
|
New()
|
|
fields = strings("meatland/meatland_records.txt","system_brief")
|
|
/*list("The heart of the teleportation system is",
|
|
"the formed telecrystal. The crystal is wrapped",
|
|
"by a set of three control coils. Below this",
|
|
"is an array of strontium-vapor lasers.",
|
|
"By adjusting the magnetic field produced by",
|
|
"the coils in conjunction with the pulse rate of",
|
|
"the laser array, a targeted translocation effect",
|
|
"may be produced directly above the pad.",
|
|
"The intensity, quality, and destination of the",
|
|
"translocation is heavily dependent on the",
|
|
"geometry of the crystal, making precision crystal",
|
|
"fabrication paramount. Additionally, extremely",
|
|
"minor field variations can result in destination",
|
|
"drift of tens or hundreds of meters.")*/
|
|
|
|
//Audio logs
|
|
/obj/item/device/audio_log/meatland_00
|
|
continuous = 0
|
|
|
|
New()
|
|
..()
|
|
audiolog_messages = strings("meatland/meatland_audiologs.txt","meatland_00_audio")
|
|
/*list("*indistinct muttering*",
|
|
"ohhh Christ.",
|
|
"They're like tin whiskers. They're goddamn tin whiskers",
|
|
"but they're in our flesh instead",
|
|
"I thought Ted had a stroke but",
|
|
"oh god it was this it was all this")*/
|
|
|
|
audiolog_speakers = strings("meatland/meatland_audiologs.txt","meatland_00_speakers")
|
|
/*list("Male voice",
|
|
"Male voice",
|
|
"Male voice",
|
|
"Male voice",
|
|
"Male voice",
|
|
"Male voice")*/
|
|
|
|
|
|
/obj/item/device/audio_log/meatland_01
|
|
|
|
continuous = 0
|
|
New()
|
|
..()
|
|
audiolog_messages = strings("meatland/meatland_audiologs.txt","meatland_01_audio")
|
|
/*list("*brushing noises*",
|
|
"Who's my little Pudding Cup? You are, yes you are",
|
|
"*buzzing*",
|
|
"*brushing continues*",
|
|
"Hmm, you've got some dandruff here. I'll pick up something for that ne-",
|
|
"Ugh, alert light is on for the main lab again. Hold on Pud, I'll be right back.",
|
|
"*bumbling*")*/
|
|
|
|
audiolog_speakers = strings("meatland/meatland_audiologs.txt","meatland_01_speakers")
|
|
/*list("???",
|
|
"Male voice",
|
|
"Space bee",
|
|
"???",
|
|
"Male voice",
|
|
"Male voice",
|
|
"Space bee")*/
|
|
|
|
/obj/item/device/audio_log/meatland_02
|
|
continuous = 0
|
|
|
|
New()
|
|
..()
|
|
audiolog_messages = strings("meatland/meatland_audiologs.txt","meatland_02_audio")
|
|
/*list("Progress log for the tenth of March, 2051",
|
|
"Corporate has been wanting us to expand our application range to include supply transport pads and a beacon-locked base station.",
|
|
"I've explained at length that that isn't viable. We still don't have the full scale teleport pad working.",
|
|
"They don't want to hear it. So then, more teleports! Who cares if they leave half of you behind! Certainly not corporate!",
|
|
"I just can't believe the-",
|
|
"...",
|
|
"Fuck's sake, is he wearing a telecrystal as a hat?",
|
|
"*footsteps, airlock whoosh*",
|
|
"*unintelligible*",
|
|
"You are hallucinating! She does not exist! She DOES. NOT. EXIST!",
|
|
"*unintelligible; yelling*",
|
|
"*airlock noises, intercom click*",
|
|
"Security to overview room C.",
|
|
"Christ, David.",
|
|
"...",
|
|
"Aw, hell.")*/
|
|
|
|
audiolog_speakers = strings("meatland/meatland_audiologs.txt","meatland_02_speakers")
|
|
/*list("Male voice",
|
|
"Male voice",
|
|
"Male voice",
|
|
"Male voice",
|
|
"Male voice",
|
|
"???",
|
|
"Male voice",
|
|
"???",
|
|
"Multiple voices",
|
|
"Male voice",
|
|
"Multiple voices",
|
|
"???",
|
|
"Male voice",
|
|
"Male voice",
|
|
"???",
|
|
"Male voice")*/
|
|
|
|
/obj/item/device/audio_log/meatland_03
|
|
continuous = 0
|
|
|
|
New()
|
|
..()
|
|
audiolog_messages = strings("meatland/meatland_audiologs.txt","meatland_03_audio")
|
|
/*list("I saw an angel in them. In the crystals. She's been talking to me. About a lot of things.",
|
|
"Why do you think she only speaks to you?",
|
|
"I don't. She speaks everyone really, but I'm the only one who listens.",
|
|
"Everyone else here is so closed...so damned closed minded. Don't they know what's at stake?",
|
|
"What is at stake, David? I want to learn.",
|
|
"Salvation! Not that bullshit some old crank on television promises for money. Real salvation!",
|
|
"That's interesting, David. When did--",
|
|
"Everyone's trying to damn themselves, everyone, I keep trying to spread her message and nobody else wants to hear it.",
|
|
"Sorry, what were you asking?",
|
|
"When did this begin? When did you start hearing these messages?",
|
|
"When I looked into the crystal. The one in the lab. She spoke to me then.",
|
|
"What are you writing? You can't let them keep me in here! I have to help people before it's too late!",
|
|
"Something terrible is coming, I know that sounds dumb but something really is! There isn't much time! PLEASE!")*/
|
|
|
|
audiolog_speakers = strings("meatland/meatland_audiologs.txt","meatland_03_speakers")
|
|
/*list("David",
|
|
"Therapist",
|
|
"David",
|
|
"David",
|
|
"Therapist",
|
|
"David",
|
|
"Therapist",
|
|
"David",
|
|
"David",
|
|
"Therapist",
|
|
"Dvaid",
|
|
"David",
|
|
"David")*/
|
|
|
|
/obj/item/device/audio_log/meatland_04
|
|
continuous = 0
|
|
|
|
New()
|
|
..()
|
|
audiolog_messages = strings("meatland/meatland_audiologs.txt","meatland_04_audio")
|
|
/*list("*thunk noise*",
|
|
"Agh, who left this on the floor--",
|
|
"Jesus God, that stink",
|
|
"What the hell is that?",
|
|
"*gagging*",
|
|
"Oh God, I'm going to barf.",
|
|
"Why is the power out? What the fuck is this?",
|
|
"*hollow moaning*",
|
|
"Who's there? Is this some prank shit?",
|
|
"...",
|
|
"Hello?",
|
|
"*loud moaning, metal buckling*",
|
|
"*screams*",
|
|
"...",
|
|
"...")*/
|
|
|
|
audiolog_speakers = strings("meatland/meatland_audiologs.txt","meatland_04_speakers")
|
|
/*list("???",
|
|
"Female voice",
|
|
"Female voice",
|
|
"Female voice",
|
|
"Female voice",
|
|
"Female voice",
|
|
"Female voice",
|
|
"???",
|
|
"Female voice",
|
|
"???",
|
|
"Female Voice",
|
|
"???",
|
|
"Female voice",
|
|
"???",
|
|
"???")*/
|
|
|
|
/obj/item/device/audio_log/meatland_grody
|
|
name = "grody doodad"
|
|
desc = "What the hell is that?"
|
|
icon = 'icons/misc/meatland.dmi'
|
|
icon_state = "audiolung"
|
|
self_destruct = 1
|
|
continuous = 0
|
|
|
|
New()
|
|
..()
|
|
audiolog_messages = strings("meatland/meatland_audiologs.txt","meatland_grody_audio")
|
|
/*list("*wheezing*",
|
|
"*splutch noises*",
|
|
"kill meeee")*/
|
|
|
|
audiolog_speakers = strings("meatland/meatland_audiologs.txt","meatland_grody_speakers")
|
|
//list("???","???","???")
|
|
|
|
attack_self()
|
|
src.name = "Audio lung"
|
|
return ..()
|
|
|
|
|
|
Topic(href, href_list)
|
|
if (href_list["command"] == "eject")
|
|
boutput(usr, "<span style=\"color:red\">You can't get it open, it's all overgrown!</span>")
|
|
return
|
|
else
|
|
return ..()
|
|
|
|
explode()
|
|
. = isturf(src.loc) ? src.loc : get_turf(src)
|
|
playsound(., "sound/effects/fleshbr1.ogg", 50, 1)
|
|
gibs(.)
|
|
qdel(src)
|
|
|
|
|
|
/obj/item/clothing/suit/space/soviet
|
|
name = "Lastochka-19 space suit"
|
|
desc = "A bulky space suit used by the current Soviet space program. This one smells like fart bologna."
|
|
icon_state = "sovspace"
|
|
item_state = "sov_suit"
|
|
|
|
/obj/item/luggable_computer/cheget
|
|
name = "important-looking briefcase"
|
|
desc = "A lockable briefcase that looks really important. It has insignias with cyrillic lettering on them."
|
|
icon = 'icons/misc/meatland.dmi'
|
|
icon_state = "cheget_closed"
|
|
luggable_type = /obj/machinery/computer3/luggable/cheget
|
|
var/locked = 1
|
|
var/code = "heh"
|
|
|
|
New()
|
|
..()
|
|
|
|
src.code = ""
|
|
. = "[num2hex(rand(4096, 65535))]"
|
|
for (var/i = 1, i < 5, i++)
|
|
switch (copytext(., i, i+1))
|
|
if ("c","C")
|
|
code += "v"
|
|
if ("f","F")
|
|
code += "g"
|
|
else
|
|
code += copytext(., i, i+1)
|
|
|
|
src.code = uppertext(src.code)
|
|
|
|
unfold()
|
|
set src in view(1)
|
|
|
|
if (usr.stat)
|
|
return
|
|
|
|
if (locked)
|
|
boutput(usr, "<span style=\"color:red\">It's locked!</span>")
|
|
return
|
|
|
|
src.deploy(usr)
|
|
return
|
|
|
|
attack_self(mob/user as mob)
|
|
user.machine = src
|
|
add_fingerprint(user)
|
|
return show_lock_panel(user)
|
|
|
|
proc/show_lock_panel(mob/user as mob)
|
|
var/dat = {"
|
|
<!DOCTYPE html>
|
|
<head>
|
|
<title>LOCK PANEL</title>
|
|
<style type="text/css">
|
|
table.keypad, td.key
|
|
{
|
|
text-align:center;
|
|
color:#1F1F1F;
|
|
background-color:#7F7F7F;
|
|
border:2px solid #1F1F1F;
|
|
padding:10px;
|
|
font-size:24px;
|
|
font-weight:bold;
|
|
}
|
|
a
|
|
{
|
|
text-align:center;
|
|
color:#1F1F1F;
|
|
background-color:#7F7F7F;
|
|
font-size:24px;
|
|
font-weight:bold;
|
|
border:2px solid #1F1F1F;
|
|
text-decoration:none;
|
|
display:block;
|
|
}
|
|
</style>
|
|
|
|
</head>
|
|
|
|
|
|
<body bgcolor=#2F2F2F>
|
|
<table border = 2 bgcolor=#7F3030 width = 150px>
|
|
<tr><td><font face='system' size = 6 color=#FF0000 id = \"readout\"> </font></td></tr>
|
|
</table>
|
|
<br>
|
|
<table class = "keypad">
|
|
<tr><td><a href='javascript:keypadIn(7);'>7</a></td><td><a href='javascript:keypadIn(8);'>8</a></td><td><a href='javascript:keypadIn(9);'>9</a></td></td><td><a href='javascript:keypadIn("A");'>A</a></td></tr>
|
|
<tr><td><a href='javascript:keypadIn(4);'>4</a></td><td><a href='javascript:keypadIn(5);'>5</a></td><td><a href='javascript:keypadIn(6)'>6</a></td></td><td><a href='javascript:keypadIn("B");'>Б</a></td></tr>
|
|
<tr><td><a href='javascript:keypadIn(1);'>1</a></td><td><a href='javascript:keypadIn(2);'>2</a></td><td><a href='javascript:keypadIn(3)'>3</a></td></td><td><a href='javascript:keypadIn("V");'>В</a></td></tr>
|
|
<tr><td><a href='javascript:keypadIn(0);'>0</a></td><td><a href='javascript:keypadIn("E");'>Е</a></td><td><a href='javascript:keypadIn("D");'>Д</a></td></td><td><a href='javascript:keypadIn("G");'>Г</a></td></tr>
|
|
|
|
<tr><td colspan=2 width = 100px><a id = "enterkey" href='?src=\ref[src];enter=0;'>ПУСК</a></td><td colspan = 2 width = 100px><a href='javascript:keypadIn("reset");'>СБРОС</a></td></tr>
|
|
</table>
|
|
|
|
<script language="JavaScript">
|
|
var currentVal = "";
|
|
|
|
function updateReadout(t, additive)
|
|
{
|
|
if ((additive != 1 && additive != "1") || currentVal == "")
|
|
{
|
|
document.getElementById("readout").innerHTML = " ";
|
|
currentVal = "";
|
|
}
|
|
var i = 0
|
|
while (i++ < 4 && currentVal.length < 4)
|
|
{
|
|
if (t.length)
|
|
{
|
|
|
|
switch (t.substr(0,1))
|
|
{
|
|
case "B":
|
|
document.getElementById("readout").innerHTML += "Б ";
|
|
break;
|
|
|
|
case "V":
|
|
document.getElementById("readout").innerHTML += "В ";
|
|
break;
|
|
|
|
case "G":
|
|
document.getElementById("readout").innerHTML += "Г ";
|
|
break;
|
|
|
|
case "D":
|
|
document.getElementById("readout").innerHTML += "Д ";
|
|
break;
|
|
|
|
case "K":
|
|
document.getElementById("readout").innerHTML += "К ";
|
|
break;
|
|
|
|
default:
|
|
document.getElementById("readout").innerHTML += t.substr(0,1) + " ";
|
|
break;
|
|
}
|
|
currentVal += t.substr(0,1);
|
|
t = t.substr(1);
|
|
}
|
|
}
|
|
|
|
document.getElementById("enterkey").setAttribute("href","?src=\ref[src];enter=" + currentVal + ";");
|
|
}
|
|
|
|
function keypadIn(num)
|
|
{
|
|
switch (num)
|
|
{
|
|
case 0:
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
case 4:
|
|
case 5:
|
|
case 6:
|
|
case 7:
|
|
case 8:
|
|
case 9:
|
|
updateReadout(num.toString(), 1);
|
|
break;
|
|
|
|
case "A":
|
|
case "B":
|
|
case "V":
|
|
case "G":
|
|
case "D":
|
|
case "E":
|
|
updateReadout(num, 1);
|
|
break;
|
|
|
|
case "reset":
|
|
updateReadout("", 0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
</script>
|
|
|
|
</body>"}
|
|
|
|
user << browse(dat, "window=cheget;size=270x300;can_resize=0;can_minimize=0")
|
|
|
|
Topic(href, href_list)
|
|
..()
|
|
if ((usr.stat || usr.restrained()) || (get_dist(src, usr) > 1))
|
|
return
|
|
|
|
if ("enter" in href_list)
|
|
|
|
if (uppertext(href_list["enter"]) == src.code)
|
|
usr << output("!OK!&0", "cheget.browser:updateReadout")
|
|
|
|
|
|
if (locked)
|
|
locked = 0
|
|
src.icon_state = "cheget_unlocked"
|
|
src.visible_message("<span style=\"color:red\">[src]'s lock mechanism clicks unlocked.</span>")
|
|
playsound(src.loc, "sound/items/Deconstruct.ogg", 65, 1)
|
|
if (prob(50))
|
|
src.visible_message("<span style=\"color:red\">[src] emits a happy bleep.</span>")
|
|
playsound(src.loc, "sound/machines/cheget_goodbloop.ogg", 30, 1)
|
|
|
|
else
|
|
locked = 1
|
|
src.icon_state = "cheget_closed"
|
|
src.visible_message("<span style=\"color:red\">[src]'s lock mechanism clunks locked.</span>")
|
|
playsound(src.loc, "sound/items/Deconstruct.ogg", 65, 1)
|
|
else if (href_list["enter"] == "")
|
|
if (locked)
|
|
return
|
|
locked = 1
|
|
src.icon_state = "cheget_closed"
|
|
|
|
src.visible_message("<span style=\"color:red\">[src]'s lock mechanism clunks locked.</span>")
|
|
playsound(src.loc, "sound/items/Deconstruct.ogg", 65, 1)
|
|
|
|
else
|
|
usr << output("HET!&0", "cheget.browser:updateReadout")
|
|
if (prob(33))
|
|
var/any_of_them_right = 0
|
|
for (var/i = 1, i <= 4, i++)
|
|
if (cmptext( copytext(href_list["enter"], i,i+1), copytext(src.code, i, i+1)))
|
|
any_of_them_right++
|
|
|
|
src.visible_message("<span style=\"color:red\">[src] emits a[(any_of_them_right > 1) ? "couple" : null] grumpy boop[(any_of_them_right > 1) ? "s" : null].</span>")
|
|
playsound(src.loc, "sound/machines/cheget_grumpbloop.ogg", 30, 1)
|
|
|
|
/obj/machinery/computer3/luggable/cheget
|
|
name = "\improper Cheget"
|
|
desc = "It certainly looks important. Isn't this the Soviet version of the nuclear football?"
|
|
icon = 'icons/misc/meatland.dmi'
|
|
icon_state = "cheget"
|
|
base_icon_state = "cheget"
|
|
setup_starting_os = /datum/computer/file/terminal_program/os/cheget
|
|
temp = ""
|
|
setup_idscan_path = null
|
|
setup_has_internal_disk = 0
|
|
setup_starting_peripheral1 = /obj/item/peripheral/cheget_key
|
|
setup_starting_peripheral2 = /obj/item/peripheral/cheget_key
|
|
|
|
/datum/computer/file/terminal_program/os/cheget
|
|
name = "AUTH2"
|
|
var/tmp/list/knownKeys = list()
|
|
var/tmp/inPasswordRequestMode = 0
|
|
|
|
initialize()
|
|
..()
|
|
src.master.temp = ""
|
|
src.master.temp_add = ""
|
|
src.print_text("Пожaлyйcтa, вcтaвьтe ключи aвтoриэaции.")
|
|
|
|
input_text(text)
|
|
if(..() || !inPasswordRequestMode)
|
|
return
|
|
|
|
src.print_text("НЕВЕРНЫЙ ПАРОЛЬ")
|
|
|
|
disposing()
|
|
knownKeys = null
|
|
|
|
..()
|
|
|
|
receive_command(obj/source, command, datum/signal/signal)
|
|
if((..()))
|
|
return
|
|
|
|
if (command == "key_auth")
|
|
if (signal && signal.data["authcode"] && !(signal.data["authcode"] in src.knownKeys))
|
|
knownKeys += signal.data["authcode"]
|
|
|
|
if (knownKeys.len >= 2 && !inPasswordRequestMode)
|
|
inPasswordRequestMode = 1
|
|
src.print_text("ПАРОЛЬ?")
|
|
|
|
|
|
else if (command == "key_deauth")
|
|
if (signal && signal.data["authcode"] && (signal.data["authcode"] in src.knownKeys))
|
|
knownKeys -= signal.data["authcode"]
|
|
|
|
if (knownKeys.len < 2)
|
|
inPasswordRequestMode = 0
|
|
|
|
/obj/item/peripheral/cheget
|
|
name = "lock card"
|
|
desc = "A card with an electronic lock attached to it. The kind with a keyhole. Wonder what this is for."
|
|
icon_state = "card_mod"
|
|
setup_has_badge = 1
|
|
func_tag = "KEY_LOCK"
|
|
|
|
return_status_text()
|
|
return "LOCKED"
|
|
|
|
return_badge()
|
|
return "Key: <a href='?src=\ref[src];key=1'>-----</a>"
|
|
|
|
Topic(href, href_list)
|
|
if(..())
|
|
return
|
|
|
|
if(get_dist(host, usr) > 1)
|
|
return
|
|
|
|
if(src.host)
|
|
usr.machine = src.host
|
|
|
|
if(href_list["key"] && istype(usr.equipped(), /obj/item/device/key))
|
|
boutput(usr, "<span style=\"color:red\">It doesn't fit. Must be the wrong key.</span>")
|
|
host.visible_message("<span style=\"color:red\">[src.loc] emits a grumpy boop.</span>")
|
|
playsound(src.loc, "sound/machines/cheget_grumpbloop.ogg", 30, 1)
|
|
|
|
return
|
|
|
|
/obj/item/peripheral/cheget_key
|
|
name = "lock card"
|
|
desc = "A card with an electronic lock attached to it. The kind with a keyhole. Wonder what this is for."
|
|
setup_has_badge = 1
|
|
func_tag = "KEY_LOCK"
|
|
var/obj/item/device/key/cheget/inserted_key = null
|
|
|
|
return_status_text()
|
|
return src.inserted_key ? "UNLOCKED" : "LOCKED"
|
|
|
|
return_badge()
|
|
if(src.inserted_key)
|
|
. = "Key: <A HREF='?src=\ref[src];eject_key=1'>[src.inserted_key.name]</A>"
|
|
else
|
|
. = "Key: <a href='?src=\ref[src];key=1'>-----</a>"
|
|
|
|
Topic(href, href_list)
|
|
if(..())
|
|
return
|
|
|
|
if(get_dist(host, usr) > 1)
|
|
return
|
|
|
|
if(src.host)
|
|
usr.machine = src.host
|
|
|
|
if(href_list["key"])
|
|
if(istype(usr.equipped(), /obj/item/device/key/cheget) && !src.inserted_key)
|
|
var/obj/item/device/key/cheget/C = usr.equipped()
|
|
usr.drop_item()
|
|
C.set_loc(src)
|
|
src.inserted_key = C
|
|
boutput(usr, "<span style=\"color:blue\">You insert the key and turn it.</span>")
|
|
playsound(host.loc, 'sound/effects/thunk.ogg', 30, 1)
|
|
spawn(10)
|
|
if(src.inserted_key)
|
|
host.visible_message("<span style=\"color:red\">[host] emits a satisfied boop and a little green light comes on.</span>")
|
|
playsound(host.loc, 'sound/machines/cheget_goodbloop.ogg', 30, 1)
|
|
var/datum/signal/authSignal = get_free_signal()
|
|
authSignal.data = list("authcode"="\ref[src]")
|
|
send_command("key_auth", authSignal)
|
|
|
|
else if(istype(usr.equipped(), /obj/item/device/key))
|
|
boutput(usr, "<span style=\"color:red\">It doesn't fit. Must be the wrong key.</span>")
|
|
host.visible_message("<span style=\"color:red\">[host] emits a grumpy boop.</span>")
|
|
playsound(host.loc, 'sound/machines/cheget_grumpbloop.ogg', 30, 1)
|
|
|
|
else if (href_list["eject_key"])
|
|
if(src.inserted_key)
|
|
boutput(usr, "<span style=\"color:blue\">You turn the key and pull it out of the lock. The green light turns off.</span>")
|
|
playsound(src.loc, "sound/effects/thunk.ogg", 30, 1)
|
|
src.inserted_key.set_loc(get_turf(src.loc))
|
|
src.inserted_key = null
|
|
spawn(10)
|
|
if(!src.inserted_key)
|
|
host.visible_message("<span style=\"color:red\">[host] emits a dour boop and a small red light flickers on.</span>")
|
|
playsound(host.loc, 'sound/machines/cheget_sadbloop.ogg', 30, 1)
|
|
var/datum/signal/deauthSignal = get_free_signal()
|
|
deauthSignal.data = list("authcode"="\ref[src]")
|
|
send_command("key_deauth", deauthSignal)
|
|
else
|
|
boutput(usr, "<span style=\"color:red\">You reach to remove the key from the computer... only to find it missing! Where did it go? ...mysterious.</span>")
|
|
|
|
host.updateUsrDialog()
|
|
|
|
/turf/unsimulated/floor/key_floor
|
|
var/found_thing = 0
|
|
attack_hand(var/mob/user)
|
|
if(!found_thing)
|
|
found_thing = 1
|
|
user.show_text("Huh, one of these tiles is a bit loose. Underneath it is... a key?", "red")
|
|
new /obj/item/device/key/cheget(src)
|
|
else
|
|
user.show_text("Nothing out of the ordinary.", "blue")
|
|
|
|
/obj/meatland_obelisk
|
|
name = "Onyx Obelisk"
|
|
desc = "\"WHO PUT BELLA IN THE WYCH ELM?\"<br>There is a small keyhole on the front."
|
|
icon = 'icons/misc/halloween.dmi'
|
|
icon_state = "tombstone"
|
|
anchored = 1
|
|
density = 1
|
|
var/opened = 0
|
|
|
|
attackby(obj/item/O as obj, mob/user as mob)
|
|
if (istype(O, /obj/item/device/key))
|
|
if (opened)
|
|
boutput(user, "<span style=\"color:red\">It's already been used, ok.</span>")
|
|
return
|
|
|
|
if (findtext(O.name, "onyx"))
|
|
opened = 1
|
|
user.visible_message("<span style=\"color:red\"><b>[user] inserts [O] into [src]!</b></span>")
|
|
playsound(src.loc, "sound/effects/thunk.ogg", 60, 1)
|
|
qdel(O)
|
|
|
|
src.visible_message("<span style=\"color:red\">Something pops out of [src]!</span>")
|
|
new /obj/item/skull/crystal(get_turf(src))
|
|
|
|
else
|
|
boutput(user, "<span style=\"color:red\">It doesn't fit. Dang.</span>")
|
|
return
|
|
|
|
else if (istype(O, /obj/item/iomoon_key))
|
|
boutput(user, "<span style=\"color:red\">Okay, that isn't the right answer to this puzzle either.<br>Good thinking, though!</span>")
|
|
|
|
else if (istype(O, /obj/item/reagent_containers/food/snacks/pie/lime))
|
|
boutput(user, "<span style=\"color:red\">You can just barely hear a hollow voice say \"ugh.\"[prob(20) ? " Phillip Farmer??" : null]</span>")
|
|
|
|
else
|
|
return ..()
|
|
/*
|
|
* Puzzle elements and doors
|
|
*/
|
|
|
|
/obj/machinery/door/unpowered/martian/meat
|
|
name = "Sphincter"
|
|
desc = "Do you really want to go through that? Really?"
|
|
icon = 'icons/misc/meatland.dmi'
|
|
|
|
/obj/iomoon_puzzle/meat_ganglion
|
|
name = "ginormous ganglion"
|
|
desc = "It's a big ol' ball of nerves. Normally, these aren't the size of patio furniture, but. um. <i>future.</i>"
|
|
icon = 'icons/misc/meatland.dmi'
|
|
icon_state = "ganglion0"
|
|
anchored = 1
|
|
density = 1
|
|
var/timer = 0 //Seconds to toggle back off after activation. Zero to just act as a toggle.
|
|
var/active = 0
|
|
var/latching = 0 //Remain on indefinitely.
|
|
var/open_mode = 0 //0 for closed->open, 1 for open->closed
|
|
var/datum/light/light
|
|
|
|
New()
|
|
..()
|
|
|
|
light = new /datum/light/point
|
|
light.attach(src)
|
|
light.set_brightness(0.4)
|
|
light.set_color(0.97, 0.837, 0.32)
|
|
|
|
if (findtext(id, ";"))
|
|
id = params2list(id)
|
|
|
|
attack_ai(mob/user as mob)
|
|
if (isrobot(user))
|
|
return attack_hand(user)
|
|
|
|
attack_hand(mob/user as mob)
|
|
if (user.stat || user.weakened || get_dist(user, src) > 1 || !user.can_use_hands())
|
|
return
|
|
|
|
user.visible_message("<span style=\"color:red\">[user] presses against [src].</span>", "<span style=\"color:red\">You press against [src]. Ew.</span>")
|
|
return toggle()
|
|
|
|
proc
|
|
toggle()
|
|
if (timer)
|
|
if (active)
|
|
return 1
|
|
|
|
return src.activate()
|
|
|
|
if (active)
|
|
return src.deactivate()
|
|
else
|
|
return src.activate()
|
|
|
|
activate()
|
|
if (active)
|
|
return 1
|
|
|
|
playsound(src.loc, "sound/effects/fleshbr1.ogg", 50, 1)
|
|
src.icon_state = "ganglion[++active]"
|
|
light.enable()
|
|
|
|
if (timer)
|
|
if (timer > 3)
|
|
src.icon_state = "ganglion_blink_slow"
|
|
spawn ((timer - 3) * 10)
|
|
src.icon_state = "ganglion_blink_fast"
|
|
sleep(30)
|
|
src.deactivate()
|
|
|
|
else
|
|
src.icon_state = "ganglion_blink_fast"
|
|
spawn (timer * 10)
|
|
src.deactivate()
|
|
|
|
if (id)
|
|
if (istype(id, /list))
|
|
for (var/sub_id in id)
|
|
var/obj/iomoon_puzzle/target = locate(sub_id)
|
|
if (istype(target))
|
|
if (src.open_mode)
|
|
target.deactivate()
|
|
else
|
|
target.activate()
|
|
else
|
|
var/obj/iomoon_puzzle/target = locate(id)
|
|
if (istype(target))
|
|
if (src.open_mode)
|
|
target.deactivate()
|
|
else
|
|
target.activate()
|
|
|
|
return 0
|
|
|
|
deactivate()
|
|
if (!active || latching)
|
|
return 1
|
|
|
|
playsound(src.loc, "sound/effects/fleshbr1.ogg", 50, 1)
|
|
src.icon_state = "ganglion[--active]"
|
|
light.disable()
|
|
|
|
if (id)
|
|
if (istype(id, /list))
|
|
for (var/sub_id in id)
|
|
var/obj/iomoon_puzzle/target_doodad = locate(sub_id)
|
|
if (istype(target_doodad))
|
|
if (src.open_mode)
|
|
target_doodad.activate()
|
|
else
|
|
target_doodad.deactivate()
|
|
else
|
|
var/obj/iomoon_puzzle/target_doodad = locate(id)
|
|
if (istype(target_doodad))
|
|
if (src.open_mode)
|
|
target_doodad.activate()
|
|
else
|
|
target_doodad.deactivate()
|
|
|
|
return 0
|
|
|
|
/obj/iomoon_puzzle/ancient_robot_door/meat
|
|
name = "enormous mandibles"
|
|
desc = "There's no getting past these jaws when they're closed. Ideally, one would not be between them when they close."
|
|
icon = 'icons/misc/meatland.dmi'
|
|
icon_state = "fangdoor1"
|
|
density = 1
|
|
anchored = 1
|
|
opacity = 1
|
|
|
|
open()
|
|
if (opened || changing_state == 1)
|
|
return
|
|
|
|
opened = 1
|
|
changing_state = 1
|
|
active = (opened != default_state)
|
|
|
|
flick("fangdoorc0",src)
|
|
src.icon_state = "fangdoor0"
|
|
density = 0
|
|
opacity = 0
|
|
src.name = "unsealed door"
|
|
spawn(13)
|
|
changing_state = 0
|
|
return
|
|
|
|
|
|
close()
|
|
if (!opened || changing_state == -1)
|
|
return
|
|
|
|
opened = 0
|
|
changing_state = -1
|
|
active = (opened != default_state)
|
|
|
|
density = 1
|
|
opacity = 1
|
|
flick("fangdoorc1",src)
|
|
for (var/mob/living/L in src.loc)
|
|
if (prob(10))
|
|
boutput(L, "<span style=\"color:blue\">You just barely slip by the clenching teeth unharmed!</span>")
|
|
else if (prob(80))
|
|
L.visible_message("<span style=\"color:red\"><b>[src] slams shut on [L]!</b></span>")
|
|
if (ishuman(L))
|
|
L:sever_limb(pick("l_arm", "r_arm", "L_leg", "r_leg"))
|
|
else
|
|
random_brute_damage(L, 25)
|
|
else
|
|
L.visible_message("<span style=\"color:red\"><b>[L] is gored by [src]!</b></span>", "<span style=\"color:red\"><b>OH SHIT</b></span>")
|
|
playsound(src.loc, "sound/effects/fleshbr1.ogg", 50, 1)
|
|
L.gib()
|
|
|
|
src.icon_state = "fangdoor1"
|
|
spawn(13)
|
|
changing_state = 0
|
|
return
|
|
|
|
/obj/iomoon_puzzle/generic_logic_element
|
|
name = "generic puzzle logic element"
|
|
icon = 'icons/mob/screen1.dmi'
|
|
icon_state = "x"
|
|
invisibility = 101
|
|
var/output_ids = null //legacy
|
|
var/inputs_required = 1
|
|
var/input_counter = 0
|
|
|
|
New()
|
|
..()
|
|
|
|
id = output_ids
|
|
|
|
activate()
|
|
input_counter++
|
|
if (input_counter == inputs_required)
|
|
if (id)
|
|
if (istype(id, /list))
|
|
for (var/sub_id in id)
|
|
var/obj/iomoon_puzzle/target_doodad = locate(sub_id)
|
|
if (istype(target_doodad))
|
|
target_doodad.activate()
|
|
else
|
|
var/obj/iomoon_puzzle/target_doodad = locate(id)
|
|
if (istype(target_doodad))
|
|
target_doodad.activate()
|
|
|
|
deactivate()
|
|
input_counter = max(0, input_counter - 1)
|
|
if (input_counter < inputs_required)
|
|
if (id)
|
|
if (istype(id, /list))
|
|
for (var/sub_id in id)
|
|
var/obj/iomoon_puzzle/target_doodad = locate(sub_id)
|
|
if (istype(target_doodad))
|
|
target_doodad.deactivate()
|
|
else
|
|
var/obj/iomoon_puzzle/target_doodad = locate(id)
|
|
if (istype(target_doodad))
|
|
target_doodad.deactivate()
|
|
|
|
//Meat limbs: probably not a desirable prize
|
|
/obj/item/parts/human_parts/meat_mutant
|
|
|
|
getMobIcon(var/lying)
|
|
if (lying)
|
|
if (src.lyingImage)
|
|
return src.lyingImage
|
|
|
|
src.lyingImage = image('icons/mob/human.dmi', "[slot]_mutated_l")
|
|
return lyingImage
|
|
|
|
else
|
|
if (src.standImage)
|
|
return src.standImage
|
|
|
|
src.standImage = image('icons/mob/human.dmi', "[slot]_mutated")
|
|
return standImage
|
|
|
|
arm
|
|
desc = "A weirdo blob of tumors and tendons in the crude form of an arm."
|
|
|
|
left
|
|
name = "weird left arm"
|
|
icon_state = "arm_left_mutant"
|
|
slot = "l_arm"
|
|
handlistPart = "l_hand_mutated"
|
|
|
|
right
|
|
name = "grody right arm"
|
|
icon_state = "arm_right_mutant"
|
|
slot = "r_arm"
|
|
handlistPart = "r_hand_mutated"
|
|
|
|
|
|
//Gib gun. Maybe a prize??? except for the whole "firing your internal organs as projectiles is not healthy" thing.
|
|
/obj/item/gun/gibgun
|
|
name = "grody gizmo"
|
|
desc = "Some kind of weirdo metal-laden meat tube. Oh gosh, what would Freud say about this?"
|
|
//icon = 'icons/misc/meatland.dmi'
|
|
icon_state = "gibgun"
|
|
cant_self_remove = 1
|
|
cant_other_remove = 1
|
|
cant_drop = 1
|
|
var/last_shot = 0
|
|
|
|
pickup(var/mob/user)
|
|
boutput(user, "<span style=\"color:red\">[src] clamps down on your arm! Mercy sakes!</span>")
|
|
src.w_class = 10
|
|
return ..()
|
|
|
|
dropped()
|
|
src.w_class = initial(src.w_class)
|
|
return ..()
|
|
|
|
shoot(var/target,var/start,var/mob/user,var/POX,var/POY)
|
|
if (!istype(target, /turf) || !istype(start, /turf))
|
|
return
|
|
if (target == user.loc || target == loc)
|
|
return
|
|
|
|
if((last_shot + 15) <= world.time)
|
|
if (user.health <= 0)
|
|
boutput(usr, "<span style=\"color:red\">You try to fire, but just feel woozy, bolts of pain shooting up your arm.</span>")
|
|
return
|
|
|
|
last_shot = world.time
|
|
|
|
var/turf/T = get_turf(src)
|
|
var/obj/item/reagent_containers/food/snacks/ingredient/meatpaste/theGib = new /obj/item/reagent_containers/food/snacks/ingredient/meatpaste {throwforce = 8;name="ambiguous organ";desc = "Some kind of human organ, probably.";icon = 'icons/misc/meatland.dmi'} (T)
|
|
theGib.icon_state = "meatproj[rand(1,3)]"
|
|
spawn(15)
|
|
if (theGib)
|
|
theGib.throwforce = 1
|
|
|
|
theGib.throw_at(target, 8, 2)
|
|
random_brute_damage(user, rand(5,15))
|
|
playsound(T, "sound/effects/fleshbr1.ogg", 40, 1)
|
|
|
|
user.visible_message("<span style=\"color:red\"><b>[user]</b> blasts a lump of flesh at [target]!</span>")
|
|
if (prob(15))
|
|
user.emote("scream")
|
|
|
|
/obj/decal/fakeobjects/core
|
|
name = "reactor core"
|
|
desc = "It looks pretty well ruined."
|
|
icon = 'icons/effects/64x64.dmi'
|
|
icon_state = "meat_reactor"
|
|
anchored = 1
|
|
opacity = 0
|
|
density = 0 |