mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-14 08:34:16 +01:00
Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into swordnborg
Conflicts: icons/obj/surgery.dmi
This commit is contained in:
@@ -519,21 +519,16 @@ var/global/nologevent = 0
|
||||
if(!check_rights(R_SERVER))
|
||||
return
|
||||
|
||||
var/confirm = alert("Restart the game world?", "Restart", "Yes", "Cancel")
|
||||
if(confirm == "Cancel")
|
||||
var/delay = input("What delay should the restart have (in seconds)?", "Restart Delay", 5) as num|null
|
||||
if(isnull(delay))
|
||||
return
|
||||
if(confirm == "Yes")
|
||||
var/delay = input("What delay should the restart have (in seconds)?", "Restart Delay", 5) as num
|
||||
if(isnull(delay))
|
||||
delay = 50
|
||||
else
|
||||
delay = delay * 10
|
||||
message_admins("[key_name_admin(usr)] has initiated a server restart with a delay of [delay/10] seconds")
|
||||
log_admin("[key_name(usr)] has initiated a server restart with a delay of [delay/10] seconds")
|
||||
ticker.delay_end = 0
|
||||
feedback_add_details("admin_verb","R") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
world.Reboot("Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key].", "end_error", "admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]", delay)
|
||||
|
||||
else
|
||||
delay = delay * 10
|
||||
message_admins("[key_name_admin(usr)] has initiated a server restart with a delay of [delay/10] seconds")
|
||||
log_admin("[key_name(usr)] has initiated a server restart with a delay of [delay/10] seconds")
|
||||
ticker.delay_end = 0
|
||||
feedback_add_details("admin_verb","R") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
world.Reboot("Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key].", "end_error", "admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]", delay)
|
||||
|
||||
/datum/admins/proc/announce()
|
||||
set category = "Special Verbs"
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
//adv. hotkey mode vars, code using them in /interface/interface.dm//
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
|
||||
var/hotkeytype = "QWERTY" //what set of hotkeys is in use(defaulting to QWERTY because I can't be bothered to ake this save on SQL)
|
||||
var/hotkeytype = "QWERTY" //what set of hotkeys is in use(defaulting to QWERTY because I can't be bothered to make this save on SQL)
|
||||
var/hotkeyon = 0 //is the hotkey on?
|
||||
|
||||
var/hotkeylist = list( //list defining hotkey types, look at lists in place for structure if adding any if the future
|
||||
@@ -69,7 +69,10 @@
|
||||
"off" = "macro"),
|
||||
"AZERTY" = list(
|
||||
"on" = "AZERTYon",
|
||||
"off" = "AZERTYoff")
|
||||
"off" = "AZERTYoff"),
|
||||
"Cyborg" = list(
|
||||
"on" = "borghotkeymode",
|
||||
"off" = "borgmacro")
|
||||
)
|
||||
|
||||
var/reset_stretch = 0 //Used by things that fiddle with client's stretch-to-fit.
|
||||
@@ -17,3 +17,7 @@
|
||||
/mob/camera/Destroy()
|
||||
..()
|
||||
return QDEL_HINT_HARDDEL_NOW
|
||||
|
||||
/mob/camera/Login()
|
||||
..()
|
||||
update_interface()
|
||||
|
||||
@@ -2,4 +2,6 @@
|
||||
..()
|
||||
if (ghostimage)
|
||||
ghostimage.icon_state = src.icon_state
|
||||
updateghostimages()
|
||||
updateghostimages()
|
||||
|
||||
update_interface()
|
||||
@@ -3,6 +3,20 @@
|
||||
#define BLOODCRAWL_EAT 2
|
||||
|
||||
/mob/living/proc/phaseout(var/obj/effect/decal/cleanable/B)
|
||||
|
||||
if(iscarbon(src))
|
||||
var/mob/living/carbon/C = src
|
||||
if(C.l_hand || C.r_hand)
|
||||
C << "<span class='warning'>You may not hold items while blood crawling!</span>"
|
||||
return 0
|
||||
var/obj/item/weapon/bloodcrawl/B1 = new(C)
|
||||
var/obj/item/weapon/bloodcrawl/B2 = new(C)
|
||||
B1.icon_state = "bloodhand_left"
|
||||
B2.icon_state = "bloodhand_right"
|
||||
C.put_in_hands(B1)
|
||||
C.put_in_hands(B2)
|
||||
C.regenerate_icons()
|
||||
|
||||
var/mob/living/kidnapped = null
|
||||
var/turf/mobloc = get_turf(src.loc)
|
||||
var/turf/bloodloc = get_turf(B.loc)
|
||||
@@ -29,10 +43,11 @@
|
||||
if(istype(src.pulling, /mob/living/))
|
||||
var/mob/living/victim = src.pulling
|
||||
if(victim.stat == CONSCIOUS)
|
||||
src.visible_message("[victim] kicks free of \the [src] at the last second!")
|
||||
src.visible_message("<span class='warning'>[victim] kicks free of [B] just before entering it!</span>")
|
||||
else
|
||||
victim.loc = holder///holder
|
||||
src.visible_message("<span class='danger'><B>\The [src] drags [victim] into [B]!</B></span>")
|
||||
victim.emote("scream")
|
||||
src.visible_message("<span class='warning'><b>[src] drags [victim] into [B]!</b></span>")
|
||||
kidnapped = victim
|
||||
flick("jaunt",animation)
|
||||
src.loc = holder
|
||||
@@ -44,32 +59,44 @@
|
||||
sleep(6)
|
||||
if (animation)
|
||||
qdel(animation)
|
||||
playsound(get_turf(src),'sound/misc/Demon_consume.ogg', 100, 1)
|
||||
sleep(30)
|
||||
playsound(get_turf(src),'sound/misc/Demon_consume.ogg', 100, 1)
|
||||
sleep(30)
|
||||
playsound(get_turf(src),'sound/misc/Demon_consume.ogg', 100, 1)
|
||||
sleep(30)
|
||||
src << "<B>You devour [kidnapped]. Your health is fully restored.</B>"
|
||||
src.adjustBruteLoss(-1000)
|
||||
src.adjustFireLoss(-1000)
|
||||
src.adjustOxyLoss(-1000)
|
||||
src.adjustToxLoss(-1000)
|
||||
kidnapped.ghostize()
|
||||
qdel(kidnapped)
|
||||
if (istype(src, /mob/living/simple_animal/slaughter)) //rason, do not want humans to get this
|
||||
for(var/i = 3; i > 0; i--)
|
||||
playsound(get_turf(src),'sound/misc/Demon_consume.ogg', 100, 1)
|
||||
sleep(30)
|
||||
if (kidnapped)
|
||||
src << "<B>You devour [kidnapped]. Your health is fully restored.</B>"
|
||||
src.adjustBruteLoss(-1000)
|
||||
src.adjustFireLoss(-1000)
|
||||
src.adjustOxyLoss(-1000)
|
||||
src.adjustToxLoss(-1000)
|
||||
|
||||
var/mob/living/simple_animal/slaughter/demon = src
|
||||
demon.devoured++
|
||||
if (istype(src, /mob/living/simple_animal/slaughter)) //rason, do not want humans to get this
|
||||
|
||||
var/mob/living/simple_animal/slaughter/demon = src
|
||||
demon.devoured++
|
||||
kidnapped << "<span class='userdanger'>You feel teeth sink into your flesh, and the--</span>"
|
||||
kidnapped.adjustBruteLoss(1000)
|
||||
kidnapped.forceMove(src)
|
||||
demon.consumed_mobs.Add(kidnapped)
|
||||
else
|
||||
kidnapped.ghostize()
|
||||
qdel(kidnapped)
|
||||
else
|
||||
src << "<span class='danger'>You happily devour... nothing? Your meal vanished at some point!</span>"
|
||||
else
|
||||
sleep(6)
|
||||
if (animation)
|
||||
qdel(animation)
|
||||
src.notransform = 0
|
||||
|
||||
/obj/item/weapon/bloodcrawl
|
||||
name = "blood crawl"
|
||||
desc = "You are unable to hold anything while in this form."
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
flags = NODROP
|
||||
|
||||
/mob/living/proc/phasein(var/obj/effect/decal/cleanable/B)
|
||||
if(src.notransform)
|
||||
src << "<B>Finish eating first!</B>"
|
||||
src << "<span class='warning'>Finish eating first!</span>"
|
||||
else
|
||||
var/atom/movable/overlay/animation = new /atom/movable/overlay( B.loc )
|
||||
animation.name = "odd blood"
|
||||
@@ -80,19 +107,34 @@
|
||||
animation.layer = 5
|
||||
animation.master = B.loc
|
||||
animation.dir = src.dir
|
||||
flick("jauntup",animation)
|
||||
src.loc = B.loc
|
||||
B.visible_message("<span class='warning'>[B] starts to bubble...</span>")
|
||||
if(!do_after(src, 20, target = B))
|
||||
return
|
||||
if(!B)
|
||||
return
|
||||
src.forceMove(B)
|
||||
src.client.eye = src
|
||||
if (prob(25))
|
||||
if (prob(25) && istype(src, /mob/living/simple_animal/slaughter))
|
||||
var/list/voice = list('sound/hallucinations/behind_you1.ogg','sound/hallucinations/im_here1.ogg','sound/hallucinations/turn_around1.ogg','sound/hallucinations/i_see_you1.ogg')
|
||||
playsound(get_turf(src), pick(voice),50, 1, -1)
|
||||
src.visible_message("<span class='warning'><B>\The [src] rises out of \the [B]!</B>")
|
||||
playsound(get_turf(src), 'sound/misc/exit_blood.ogg', 100, 1, -1)
|
||||
flick("jauntup",animation)
|
||||
qdel(src.holder)
|
||||
src.holder = null
|
||||
sleep(6)
|
||||
if(iscarbon(src))
|
||||
var/mob/living/carbon/C = src
|
||||
for(var/obj/item/weapon/bloodcrawl/BC in C)
|
||||
C.flags = null
|
||||
C.unEquip(BC)
|
||||
qdel(BC)
|
||||
var/oldcolor = src.color
|
||||
src.color = B.color
|
||||
sleep(6)//wait for animation to finish
|
||||
if(animation)
|
||||
qdel(animation)
|
||||
spawn(30)
|
||||
src.color = oldcolor
|
||||
|
||||
/obj/effect/decal/cleanable/blood/CtrlClick(mob/living/user)
|
||||
..()
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
/mob/living/Login()
|
||||
..()
|
||||
//Mind updates
|
||||
@@ -12,6 +11,8 @@
|
||||
src << "<span class='notice'>You can ventcrawl! Use alt+click on vents to quickly travel about the station.</span>"
|
||||
//Should update regardless of if we can ventcrawl, since we can end up in pipes in other ways.
|
||||
update_pipe_vision()
|
||||
|
||||
update_interface()
|
||||
|
||||
//Round specific stuff like hud updates
|
||||
if(ticker && ticker.mode)
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
#define AI_CHECK_WIRELESS 1
|
||||
#define AI_CHECK_RADIO 2
|
||||
|
||||
var/list/ai_list = list()
|
||||
var/list/ai_verbs_default = list(
|
||||
/mob/living/silicon/ai/proc/announcement,
|
||||
/mob/living/silicon/ai/proc/ai_announcement_text,
|
||||
/mob/living/silicon/ai/proc/ai_call_shuttle,
|
||||
/mob/living/silicon/ai/proc/ai_camera_track,
|
||||
/mob/living/silicon/ai/proc/ai_camera_list,
|
||||
@@ -79,6 +77,7 @@ var/list/ai_verbs_default = list(
|
||||
var/last_paper_seen = null
|
||||
var/can_shunt = 1
|
||||
var/last_announcement = ""
|
||||
var/datum/announcement/priority/announcement
|
||||
var/obj/machinery/bot/Bot
|
||||
var/turf/waypoint //Holds the turf of the currently selected waypoint.
|
||||
var/waypoint_mode = 0 //Waypoint mode is for selecting a turf via clicking.
|
||||
@@ -97,6 +96,12 @@ var/list/ai_verbs_default = list(
|
||||
src.verbs -= silicon_subsystems
|
||||
|
||||
/mob/living/silicon/ai/New(loc, var/datum/ai_laws/L, var/obj/item/device/mmi/B, var/safety = 0)
|
||||
announcement = new()
|
||||
announcement.title = "A.I. Announcement"
|
||||
announcement.announcement_type = "A.I. Announcement"
|
||||
announcement.announcer = name
|
||||
announcement.newscast = 1
|
||||
|
||||
var/list/possibleNames = ai_names
|
||||
|
||||
var/pickedName = null
|
||||
@@ -210,6 +215,8 @@ var/list/ai_verbs_default = list(
|
||||
|
||||
/mob/living/silicon/ai/SetName(pickedName as text)
|
||||
..()
|
||||
|
||||
announcement.announcer = name
|
||||
|
||||
if(eyeobj)
|
||||
eyeobj.name = "[pickedName] (AI Eye)"
|
||||
@@ -325,15 +332,35 @@ var/list/ai_verbs_default = list(
|
||||
set name = "Show Crew Manifest"
|
||||
set category = "AI Commands"
|
||||
show_station_manifest()
|
||||
|
||||
/mob/living/silicon/ai/var/message_cooldown = 0
|
||||
/mob/living/silicon/ai/proc/ai_announcement_text()
|
||||
set category = "AI Commands"
|
||||
set name = "Make Station Announcement"
|
||||
|
||||
if(check_unable(AI_CHECK_WIRELESS | AI_CHECK_RADIO))
|
||||
return
|
||||
|
||||
if(message_cooldown)
|
||||
src << "<span class='warning'>Please allow one minute to pass between announcements.</span>"
|
||||
return
|
||||
|
||||
var/input = input(usr, "Please write a message to announce to the station crew.", "A.I. Announcement") as message|null
|
||||
if(!input)
|
||||
return
|
||||
|
||||
if(check_unable(AI_CHECK_WIRELESS | AI_CHECK_RADIO))
|
||||
return
|
||||
|
||||
announcement.Announce(input)
|
||||
message_cooldown = 1
|
||||
spawn(600)//One minute cooldown
|
||||
message_cooldown = 0
|
||||
|
||||
/mob/living/silicon/ai/proc/ai_call_shuttle()
|
||||
set name = "Call Emergency Shuttle"
|
||||
set category = "AI Commands"
|
||||
|
||||
if(src.stat == DEAD)
|
||||
src << "<span class='warning'>You can't call the shuttle because you are dead!</span>"
|
||||
return
|
||||
|
||||
if(check_unable(AI_CHECK_WIRELESS))
|
||||
return
|
||||
|
||||
@@ -356,11 +383,7 @@ var/list/ai_verbs_default = list(
|
||||
/mob/living/silicon/ai/proc/ai_cancel_call()
|
||||
set name = "Recall Emergency Shuttle"
|
||||
set category = "AI Commands"
|
||||
|
||||
if(src.stat == 2)
|
||||
src << "You can't send the shuttle back because you are dead!"
|
||||
return
|
||||
|
||||
|
||||
if(check_unable(AI_CHECK_WIRELESS))
|
||||
return
|
||||
|
||||
@@ -394,10 +417,6 @@ var/list/ai_verbs_default = list(
|
||||
set desc = "Create a vocal announcement by typing in the available words to create a sentence."
|
||||
set category = "AI Commands"
|
||||
|
||||
if(src.stat == 2)
|
||||
src << "You can't call make an announcement because you are dead!"
|
||||
return
|
||||
|
||||
if(check_unable(AI_CHECK_WIRELESS | AI_CHECK_RADIO))
|
||||
return
|
||||
|
||||
@@ -838,7 +857,7 @@ var/list/ai_verbs_default = list(
|
||||
set desc = "Change the message that's transmitted when a new crew member arrives on station."
|
||||
set category = "AI Commands"
|
||||
|
||||
var/newmsg = input("What would you like the arrival message to be? Use $name to substitute the crew member's name, and use $rank to substitute the crew member's rank.", "Change Arrival Message", arrivalmsg) as text
|
||||
var/newmsg = input("What would you like the arrival message to be? List of options: $name, $rank, $species, $gender, $age", "Change Arrival Message", arrivalmsg) as text
|
||||
if(newmsg != arrivalmsg)
|
||||
arrivalmsg = newmsg
|
||||
usr << "The arrival message has been successfully changed."
|
||||
@@ -949,14 +968,14 @@ var/list/ai_verbs_default = list(
|
||||
|
||||
/mob/living/silicon/ai/proc/check_unable(var/flags = 0)
|
||||
if(stat == DEAD)
|
||||
usr << "\red You are dead!"
|
||||
usr << "<span class='warning'>You are dead!</span>"
|
||||
return 1
|
||||
|
||||
if((flags & AI_CHECK_WIRELESS) && src.control_disabled)
|
||||
usr << "\red Wireless control is disabled!"
|
||||
usr << "<span class='warning'>Wireless control is disabled!</span>"
|
||||
return 1
|
||||
if((flags & AI_CHECK_RADIO) && src.aiRadio.disabledAi)
|
||||
src << "\red System Error - Transceiver Disabled!"
|
||||
src << "<span class='warning'>System Error - Transceiver Disabled!</span>"
|
||||
return 1
|
||||
return 0
|
||||
|
||||
@@ -980,7 +999,3 @@ var/list/ai_verbs_default = list(
|
||||
loc = card//Throw AI into the card.
|
||||
src << "You have been downloaded to a mobile storage device. Remote device connection severed."
|
||||
user << "<span class='boldnotice'>Transfer successful</span>: [name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory."
|
||||
|
||||
#undef AI_CHECK_WIRELESS
|
||||
#undef AI_CHECK_RADIO
|
||||
|
||||
|
||||
@@ -28,13 +28,19 @@ var/const/VOX_PATH = "sound/vox_fem/"
|
||||
popup.open()
|
||||
|
||||
/mob/living/silicon/ai/proc/ai_announcement()
|
||||
if(check_unable(AI_CHECK_WIRELESS | AI_CHECK_RADIO))
|
||||
return
|
||||
|
||||
if(announcing_vox > world.time)
|
||||
src << "<span class='notice'>Please wait [round((announcing_vox - world.time) / 10)] seconds.</span>"
|
||||
src << "<span class='warning'>Please wait [round((announcing_vox - world.time) / 10)] seconds.</span>"
|
||||
return
|
||||
|
||||
var/message = input(src, "WARNING: Misuse of this verb can result in you being job banned. More help is available in 'Announcement Help'", "Announcement", src.last_announcement) as text
|
||||
var/message = input(src, "WARNING: Misuse of this verb can result in you being job banned. More help is available in 'Announcement Help'", "Announcement", last_announcement) as message|null
|
||||
|
||||
last_announcement = message
|
||||
|
||||
if(check_unable(AI_CHECK_WIRELESS | AI_CHECK_RADIO))
|
||||
return
|
||||
|
||||
if(!message || announcing_vox > world.time)
|
||||
return
|
||||
@@ -54,7 +60,7 @@ var/const/VOX_PATH = "sound/vox_fem/"
|
||||
incorrect_words += word
|
||||
|
||||
if(incorrect_words.len)
|
||||
src << "<span class='notice'>These words are not available on the announcement system: [english_list(incorrect_words)].</span>"
|
||||
src << "<span class='warning'>These words are not available on the announcement system: [english_list(incorrect_words)].</span>"
|
||||
return
|
||||
|
||||
announcing_vox = world.time + VOX_DELAY
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
/mob/living/silicon/robot/Login()
|
||||
..()
|
||||
if(client)
|
||||
client.hotkeytype = "Cyborg"
|
||||
regenerate_icons()
|
||||
show_laws(0)
|
||||
if(mind) ticker.mode.remove_cultist(mind)
|
||||
if(mind) ticker.mode.remove_revolutionary(mind)
|
||||
if(mind) ticker.mode.remove_thrall(mind,0)
|
||||
if(mind) ticker.mode.remove_shadowling(mind)
|
||||
return
|
||||
return
|
||||
|
||||
@@ -377,6 +377,17 @@ var/list/robot_verbs_default = list(
|
||||
updatename()
|
||||
update_icons()
|
||||
|
||||
//for borg hotkeys, here module refers to borg inv slot, not core module
|
||||
/mob/living/silicon/robot/verb/cmd_toggle_module(module as num)
|
||||
set name = "Toggle Module"
|
||||
set hidden = 1
|
||||
toggle_module(module)
|
||||
|
||||
/mob/living/silicon/robot/verb/cmd_unequip_module()
|
||||
set name = "Unequip Module"
|
||||
set hidden = 1
|
||||
uneq_active()
|
||||
|
||||
// this verb lets cyborgs see the stations manifest
|
||||
/mob/living/silicon/robot/verb/cmd_station_manifest()
|
||||
set category = "Robot Commands"
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
//////////////////The Monster
|
||||
|
||||
/mob/living/simple_animal/slaughter
|
||||
name = "Slaughter Demon"
|
||||
real_name = "Slaughter Demon"
|
||||
desc = "You should run."
|
||||
name = "slaughter demon"
|
||||
real_name = "slaughter demon"
|
||||
desc = "A large, menacing creature covered in armored black scales. You should run."
|
||||
speak = list("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri", "orkan", "allaq")
|
||||
speak_emote = list("gurgles")
|
||||
emote_hear = list("wails","screeches")
|
||||
@@ -43,6 +43,7 @@
|
||||
|
||||
|
||||
var/devoured = 0
|
||||
var/list/consumed_mobs = list()
|
||||
|
||||
var/list/nearby_mortals = list()
|
||||
var/cooldown = 0
|
||||
@@ -61,6 +62,7 @@
|
||||
src.mind.current.verbs += /mob/living/simple_animal/slaughter/proc/slaughterWhisper
|
||||
src << src.playstyle_string
|
||||
src << "<B><span class ='notice'>You are not currently in the same plane of existence as the station. Ctrl+Click a blood pool to manifest.</span></B>"
|
||||
src << 'sound/misc/demon_dies.ogg'
|
||||
if(!(vialspawned))
|
||||
var/datum/objective/slaughter/objective = new
|
||||
var/datum/objective/demonFluff/fluffObjective = new
|
||||
@@ -83,12 +85,19 @@
|
||||
|
||||
/mob/living/simple_animal/slaughter/Die()
|
||||
..()
|
||||
var/obj/effect/decal/cleanable/blood/innards = new (get_turf(src))
|
||||
innards.icon = 'icons/obj/surgery.dmi'
|
||||
innards.icon_state = "innards"
|
||||
innards.name = "pile of viscera"
|
||||
innards.desc = "A repulsive pile of guts and gore."
|
||||
new /obj/effect/decal/cleanable/blood (src.loc)
|
||||
new /obj/effect/gibspawner/generic(get_turf(src))
|
||||
new /obj/effect/gibspawner/generic(get_turf(src))
|
||||
new /obj/item/weapon/demonheart(src.loc)
|
||||
playsound(get_turf(src),'sound/misc/demon_dies.ogg', 200, 1)
|
||||
new /obj/item/weapon/demonheart (src.loc)
|
||||
visible_message("<span class='danger'>The [src] screams in anger as its form collapes into a pool of viscera.</span>")
|
||||
visible_message("<span class='danger'>[src] screams in anger as it collapses into a puddle of viscera, its most recent meals spilling out of it.</span>")
|
||||
for(var/mob/living/M in consumed_mobs)
|
||||
M.forceMove(get_turf(src))
|
||||
ghostize()
|
||||
qdel(src)
|
||||
|
||||
@@ -97,7 +106,7 @@
|
||||
/mob/living/simple_animal/slaughter/phasein()
|
||||
..()
|
||||
speed = 0
|
||||
boost = world.time + 30
|
||||
boost = world.time + 60
|
||||
|
||||
////////////////////The Powers
|
||||
|
||||
@@ -128,23 +137,28 @@
|
||||
|
||||
//////////The Loot
|
||||
|
||||
//The loot from killing a slaughter demon - can be consumed to allow the user to blood crawl
|
||||
/obj/item/weapon/demonheart
|
||||
name = "demon's heart"
|
||||
desc = "It's still faintly beating with rage"
|
||||
name = "demon heart"
|
||||
desc = "Still it beats furiously, emanating an aura of utter hate."
|
||||
icon = 'icons/obj/surgery.dmi'
|
||||
icon_state = "heart-on"
|
||||
icon_state = "demon_heart"
|
||||
origin_tech = "combat=5;biotech=8"
|
||||
|
||||
|
||||
/obj/item/weapon/demonheart/attack_self(mob/living/user)
|
||||
visible_message("[user] feasts upon the [src].")
|
||||
user.visible_message("<span class='warning'>[user] raises [src] to their mouth and tears into it with their teeth!</span>", \
|
||||
"<span class='danger'>An unnatural hunger consumes you. You raise [src] to your mouth and devour it!</span>")
|
||||
playsound(user, 'sound/misc/Demon_consume.ogg', 50, 1)
|
||||
if(user.bloodcrawl == 0)
|
||||
user << "You absorb some of the demon's power!"
|
||||
user.visible_message("<span class='warning'>[user]'s eyes flare a deep crimson!</span>", \
|
||||
"<span class='userdanger'>You feel a strange power seep into your body... you have absorbed the demon's blood-travelling powers!</span>")
|
||||
user.bloodcrawl = BLOODCRAWL
|
||||
else if(user.bloodcrawl == 1)
|
||||
user << "You absorb some of the demon's power!"
|
||||
user << "You feel diffr-<span class = 'danger'> CONSUME THEM! </span>"
|
||||
user.bloodcrawl = BLOODCRAWL_EAT
|
||||
else
|
||||
user <<"<span class='warning'>...and you don't feel any different.</span>"
|
||||
qdel(src)
|
||||
|
||||
|
||||
|
||||
@@ -60,3 +60,28 @@
|
||||
client.verbs |= H.species.abilities
|
||||
|
||||
CallHook("Login", list("client" = src.client, "mob" = src))
|
||||
|
||||
// Calling update_interface() in /mob/Login() causes the Cyborg to immediately be ghosted; because of winget().
|
||||
// Calling it in the overriden Login, such as /mob/living/Login() doesn't cause this.
|
||||
/mob/proc/update_interface()
|
||||
if(client)
|
||||
if(winget(src, "mainwindow.hotkey_toggle", "is-checked") == "true")
|
||||
update_hotkey_mode()
|
||||
else
|
||||
update_normal_mode()
|
||||
|
||||
/mob/proc/update_hotkey_mode()
|
||||
var/hotkeyname = "hotkeymode"
|
||||
if(client)
|
||||
var/hotkeys = client.hotkeylist[client.hotkeytype]
|
||||
hotkeyname = hotkeys[client.hotkeyon ? "on" : "off"]
|
||||
client.hotkeyon = 1
|
||||
winset(src, null, "mainwindow.macro=[hotkeyname] hotkey_toggle.is-checked=true mapwindow.map.focus=true input.background-color=#F0F0F0")
|
||||
|
||||
/mob/proc/update_normal_mode()
|
||||
var/hotkeyname = "macro"
|
||||
if(client)
|
||||
var/hotkeys = client.hotkeylist[client.hotkeytype]//get the list containing the hotkey names
|
||||
hotkeyname = hotkeys[client.hotkeyon ? "on" : "off"]//get the name of the hotkey, to not clutter winset() to much
|
||||
client.hotkeyon = 0
|
||||
winset(src, null, "mainwindow.macro=[hotkeyname] hotkey_toggle.is-checked=false input.focus=true input.background-color=#D3B5B5")
|
||||
|
||||
@@ -342,6 +342,9 @@
|
||||
var/arrivalmessage = announcer.arrivalmsg
|
||||
arrivalmessage = replacetext(arrivalmessage,"$name",character.real_name)
|
||||
arrivalmessage = replacetext(arrivalmessage,"$rank",rank ? "[rank]" : "visitor")
|
||||
arrivalmessage = replacetext(arrivalmessage,"$species",character.species.name)
|
||||
arrivalmessage = replacetext(arrivalmessage,"$age",num2text(character.age))
|
||||
arrivalmessage = replacetext(arrivalmessage,"$gender",character.gender == FEMALE ? "Female" : "Male")
|
||||
announcer.say(";[arrivalmessage]")
|
||||
else
|
||||
if(character.mind)
|
||||
@@ -469,11 +472,11 @@
|
||||
if(client.prefs.disabilities & DISABILITY_FLAG_BLIND)
|
||||
new_character.dna.SetSEState(BLINDBLOCK,1,1)
|
||||
new_character.sdisabilities |= BLIND
|
||||
|
||||
|
||||
if(client.prefs.disabilities & DISABILITY_FLAG_MUTE)
|
||||
new_character.dna.SetSEState(MUTEBLOCK,1,1)
|
||||
new_character.sdisabilities |= MUTE
|
||||
|
||||
|
||||
chosen_species.handle_dna(new_character)
|
||||
|
||||
domutcheck(new_character)
|
||||
|
||||
@@ -481,7 +481,7 @@
|
||||
..()
|
||||
|
||||
/obj/machinery/power/smes/engineering
|
||||
charge = 1e6 // Engineering starts with some charge for singulo
|
||||
charge = 2e6 // Engineering starts with some charge for singulo
|
||||
|
||||
/obj/machinery/power/smes/magical
|
||||
name = "magical power storage unit"
|
||||
@@ -493,4 +493,4 @@
|
||||
charge = 5000000
|
||||
..()
|
||||
|
||||
#undef SMESRATE
|
||||
#undef SMESRATE
|
||||
|
||||
@@ -1655,76 +1655,79 @@
|
||||
|
||||
var/monkey_type = "Monkey"
|
||||
|
||||
New()
|
||||
..()
|
||||
reagents.add_reagent("protein",10)
|
||||
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/New()
|
||||
..()
|
||||
reagents.add_reagent("protein",10)
|
||||
|
||||
afterattack(obj/O as obj, mob/user as mob, proximity)
|
||||
if(!proximity) return
|
||||
if(istype(O,/obj/structure/sink) && !wrapped)
|
||||
user << "You place [name] under a stream of water..."
|
||||
loc = get_turf(O)
|
||||
return Expand()
|
||||
..()
|
||||
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/afterattack(obj/O as obj, mob/user as mob, proximity)
|
||||
if(!proximity) return
|
||||
if(istype(O,/obj/structure/sink) && !wrapped)
|
||||
user << "You place [name] under a stream of water..."
|
||||
if(loc == user)
|
||||
user.unEquip(src)
|
||||
forceMove(get_turf(src))
|
||||
return Expand()
|
||||
..()
|
||||
|
||||
attack_self(mob/user as mob)
|
||||
if(wrapped)
|
||||
Unwrap(user)
|
||||
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/attack_self(mob/user as mob)
|
||||
if(wrapped)
|
||||
Unwrap(user)
|
||||
|
||||
/*
|
||||
On_Consume(var/mob/M)
|
||||
M << "<span class = 'warning'>Something inside of you suddently expands!</span>"
|
||||
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/On_Consume(var/mob/M)
|
||||
M << "<span class = 'warning'>Something inside of you suddently expands!</span>"
|
||||
|
||||
|
||||
if (istype(M, /mob/living/carbon/human))
|
||||
//Do not try to understand.
|
||||
var/obj/item/weapon/surprise = new/obj/item/weapon(M)
|
||||
var/mob/living/carbon/monkey/ook = new monkey_type(null) //no other way to get access to the vars, alas
|
||||
surprise.icon = ook.icon
|
||||
surprise.icon_state = ook.icon_state
|
||||
surprise.name = "malformed [ook.name]"
|
||||
surprise.desc = "Looks like \a very deformed [ook.name], a little small for its kind. It shows no signs of life."
|
||||
del(ook) //rip nullspace monkey
|
||||
surprise.transform *= 0.6
|
||||
surprise.add_blood(M)
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/obj/item/organ/external/E = H.get_organ("chest")
|
||||
E.fracture()
|
||||
for (var/obj/item/organ/I in E.internal_organs)
|
||||
I.take_damage(rand(I.min_bruised_damage, I.min_broken_damage+1))
|
||||
if (istype(M, /mob/living/carbon/human))
|
||||
//Do not try to understand.
|
||||
var/obj/item/weapon/surprise = new/obj/item/weapon(M)
|
||||
var/mob/living/carbon/monkey/ook = new monkey_type(null) //no other way to get access to the vars, alas
|
||||
surprise.icon = ook.icon
|
||||
surprise.icon_state = ook.icon_state
|
||||
surprise.name = "malformed [ook.name]"
|
||||
surprise.desc = "Looks like \a very deformed [ook.name], a little small for its kind. It shows no signs of life."
|
||||
del(ook) //rip nullspace monkey
|
||||
surprise.transform *= 0.6
|
||||
surprise.add_blood(M)
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/obj/item/organ/external/E = H.get_organ("chest")
|
||||
E.fracture()
|
||||
for (var/obj/item/organ/I in E.internal_organs)
|
||||
I.take_damage(rand(I.min_bruised_damage, I.min_broken_damage+1))
|
||||
|
||||
if (!E.hidden && prob(60)) //set it snuggly
|
||||
E.hidden = surprise
|
||||
E.cavity = 0
|
||||
else //someone is having a bad day
|
||||
E.createwound(CUT, 30)
|
||||
E.embed(surprise)
|
||||
else if (issmall(M))
|
||||
M.visible_message("<span class='danger'>[M] suddenly tears in half!</span>")
|
||||
var/mob/living/carbon/monkey/ook = new monkey_type(M.loc)
|
||||
ook.name = "malformed [ook.name]"
|
||||
ook.transform *= 0.6
|
||||
ook.add_blood(M)
|
||||
M.gib()
|
||||
..()
|
||||
if (!E.hidden && prob(60)) //set it snuggly
|
||||
E.hidden = surprise
|
||||
E.cavity = 0
|
||||
else //someone is having a bad day
|
||||
E.createwound(CUT, 30)
|
||||
E.embed(surprise)
|
||||
else if (issmall(M))
|
||||
M.visible_message("<span class='danger'>[M] suddenly tears in half!</span>")
|
||||
var/mob/living/carbon/monkey/ook = new monkey_type(M.loc)
|
||||
ook.name = "malformed [ook.name]"
|
||||
ook.transform *= 0.6
|
||||
ook.add_blood(M)
|
||||
M.gib()
|
||||
..()
|
||||
*/
|
||||
|
||||
water_act(volume, temperature)
|
||||
if(volume >= 5) return Expand()
|
||||
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/water_act(volume, temperature)
|
||||
if(volume >= 5)
|
||||
return Expand()
|
||||
|
||||
proc/Expand()
|
||||
for(var/mob/M in viewers(src,7))
|
||||
M << "\red \The [src] expands!"
|
||||
var/mob/living/carbon/human/H = new (src)
|
||||
H.set_species(monkey_type)
|
||||
qdel(src)
|
||||
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/proc/Expand()
|
||||
for(var/mob/M in viewers(src,7))
|
||||
M << "\red \The [src] expands!"
|
||||
var/mob/living/carbon/human/H = new (src)
|
||||
H.set_species(monkey_type)
|
||||
qdel(src)
|
||||
|
||||
proc/Unwrap(mob/user as mob)
|
||||
icon_state = "monkeycube"
|
||||
desc = "Just add water!"
|
||||
user << "You unwrap the cube."
|
||||
wrapped = 0
|
||||
return
|
||||
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/proc/Unwrap(mob/user as mob)
|
||||
icon_state = "monkeycube"
|
||||
desc = "Just add water!"
|
||||
user << "You unwrap the cube."
|
||||
wrapped = 0
|
||||
return
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped
|
||||
desc = "Still wrapped in some paper."
|
||||
|
||||
Reference in New Issue
Block a user