This commit is contained in:
Linzolle
2019-10-11 20:06:26 -05:00
581 changed files with 63735 additions and 58634 deletions
-61
View File
@@ -1,61 +0,0 @@
/mob/living/carbon/human/virtual_reality
var/datum/mind/real_mind // where is my mind t. pixies
var/obj/machinery/vr_sleeper/vr_sleeper
var/datum/action/quit_vr/quit_action
/mob/living/carbon/human/virtual_reality/Initialize()
. = ..()
quit_action = new()
quit_action.Grant(src)
/mob/living/carbon/human/virtual_reality/death()
revert_to_reality()
..()
/mob/living/carbon/human/virtual_reality/Destroy()
revert_to_reality()
return ..()
/mob/living/carbon/human/virtual_reality/Life()
. = ..()
if(real_mind)
var/mob/living/real_me = real_mind.current
if (real_me && real_me.stat == CONSCIOUS)
return
revert_to_reality(FALSE)
/mob/living/carbon/human/virtual_reality/ghostize()
stack_trace("Ghostize was called on a virtual reality mob")
/mob/living/carbon/human/virtual_reality/ghost()
set category = "OOC"
set name = "Ghost"
set desc = "Relinquish your life and enter the land of the dead."
revert_to_reality(FALSE)
/mob/living/carbon/human/virtual_reality/proc/revert_to_reality(deathchecks = TRUE)
if(real_mind && mind)
real_mind.current.audiovisual_redirect = null
real_mind.current.ckey = ckey
real_mind.current.stop_sound_channel(CHANNEL_HEARTBEAT)
if(deathchecks && vr_sleeper)
if(vr_sleeper.you_die_in_the_game_you_die_for_real)
to_chat(real_mind, "<span class='warning'>You feel everything fading away...</span>")
real_mind.current.death(0)
if(deathchecks && vr_sleeper)
vr_sleeper.vr_human = null
vr_sleeper = null
real_mind = null
/datum/action/quit_vr
name = "Quit Virtual Reality"
icon_icon = 'icons/mob/actions/actions_vr.dmi'
button_icon_state = "logout"
/datum/action/quit_vr/Trigger()
if(..())
if(istype(owner, /mob/living/carbon/human/virtual_reality))
var/mob/living/carbon/human/virtual_reality/VR = owner
VR.revert_to_reality(FALSE)
else
Remove(owner)
+44
View File
@@ -0,0 +1,44 @@
/mob/proc/build_virtual_character(mob/M)
mind_initialize()
if(!M)
return FALSE
name = M.name
real_name = M.real_name
mind.name = M.real_name
return TRUE
/mob/living/carbon/build_virtual_character(mob/M)
. = ..()
if(!.)
return
if(iscarbon(M))
var/mob/living/carbon/C = M
C.dna?.transfer_identity(src)
/mob/living/carbon/human/build_virtual_character(mob/M, datum/outfit/outfit)
. = ..()
if(!.)
return
var/mob/living/carbon/human/H
if(ishuman(M))
H = M
socks = H ? H.socks : random_socks()
socks_color = H ? H.socks_color : random_color()
undershirt = H ? H.undershirt : random_undershirt(M.gender)
shirt_color = H ? H.shirt_color : random_color()
underwear = H ? H.underwear : random_underwear(M.gender)
undie_color = H ? H.undie_color : random_color()
give_genitals(TRUE)
if(outfit)
var/datum/outfit/O = new outfit()
O.equip(src)
/datum/action/quit_vr
name = "Quit Virtual Reality"
icon_icon = 'icons/mob/actions/actions_vr.dmi'
button_icon_state = "logout"
/datum/action/quit_vr/Trigger() //this merely a trigger for /datum/component/virtual_reality
. = ..()
if(!.)
Remove(owner)
+56 -69
View File
@@ -1,5 +1,3 @@
//Glorified teleporter that puts you in a new human body.
// it's """VR"""
/obj/machinery/vr_sleeper
@@ -12,9 +10,10 @@
circuit = /obj/item/circuitboard/machine/vr_sleeper
var/you_die_in_the_game_you_die_for_real = FALSE
var/datum/effect_system/spark_spread/sparks
var/mob/living/carbon/human/virtual_reality/vr_human
var/mob/living/vr_mob
var/virtual_mob_type = /mob/living/carbon/human
var/vr_category = "default" //Specific category of spawn points to pick from
var/allow_creating_vr_humans = TRUE //So you can have vr_sleepers that always spawn you as a specific person or 1 life/chance vr games
var/allow_creating_vr_mobs = TRUE //So you can have vr_sleepers that always spawn you as a specific person or 1 life/chance vr games
var/only_current_user_can_interact = FALSE
/obj/machinery/vr_sleeper/Initialize()
@@ -44,7 +43,7 @@
/obj/machinery/vr_sleeper/Destroy()
open_machine()
cleanup_vr_human()
cleanup_vr_mob()
QDEL_NULL(sparks)
return ..()
@@ -58,8 +57,9 @@
/obj/machinery/vr_sleeper/emag_act(mob/user)
. = ..()
if(you_die_in_the_game_you_die_for_real)
if(!(obj_flags & EMAGGED))
return
obj_flags |= EMAGGED
you_die_in_the_game_you_die_for_real = TRUE
sparks.start()
addtimer(CALLBACK(src, .proc/emagNotify), 150)
@@ -69,12 +69,11 @@
icon_state = "[initial(icon_state)][state_open ? "-open" : ""]"
/obj/machinery/vr_sleeper/open_machine()
if(!state_open)
if(vr_human)
vr_human.revert_to_reality(FALSE)
if(occupant)
SStgui.close_user_uis(occupant, src)
..()
if(state_open)
return
if(occupant)
SStgui.close_user_uis(occupant, src)
return ..()
/obj/machinery/vr_sleeper/MouseDrop_T(mob/target, mob/user)
if(user.stat || user.lying || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !user.IsAdvancedToolUser())
@@ -94,22 +93,20 @@
if("vr_connect")
var/mob/living/carbon/human/human_occupant = occupant
if(human_occupant && human_occupant.mind && usr == occupant)
to_chat(occupant, "<span class='warning'>Transferring to virtual reality...</span>")
if(vr_human && vr_human.stat == CONSCIOUS && !vr_human.real_mind)
SStgui.close_user_uis(occupant, src)
human_occupant.audiovisual_redirect = vr_human
vr_human.real_mind = human_occupant.mind
vr_human.ckey = human_occupant.ckey
to_chat(vr_human, "<span class='notice'>Transfer successful! You are now playing as [vr_human] in VR!</span>")
if(vr_mob && (!istype(vr_mob) || !vr_mob.InCritical()) && !vr_mob.GetComponent(/datum/component/virtual_reality))
vr_mob.AddComponent(/datum/component/virtual_reality, human_occupant, src, you_die_in_the_game_you_die_for_real)
to_chat(vr_mob, "<span class='notice'>Transfer successful! You are now playing as [vr_mob] in VR!</span>")
else
if(allow_creating_vr_humans)
if(allow_creating_vr_mobs)
to_chat(occupant, "<span class='warning'>Virtual avatar not found, attempting to create one...</span>")
var/obj/effect/landmark/vr_spawn/V = get_vr_spawnpoint()
var/turf/T = get_turf(V)
if(T)
SStgui.close_user_uis(occupant, src)
build_virtual_human(occupant, T, V.vr_outfit)
to_chat(vr_human, "<span class='notice'>Transfer successful! You are now playing as [vr_human] in VR!</span>")
new_player(occupant, T, V.vr_outfit)
to_chat(vr_mob, "<span class='notice'>Transfer successful! You are now playing as [vr_mob] in VR!</span>")
else
to_chat(occupant, "<span class='warning'>Virtual world misconfigured, aborting transfer</span>")
else
@@ -117,8 +114,8 @@
. = TRUE
if("delete_avatar")
if(!occupant || usr == occupant)
if(vr_human)
cleanup_vr_human()
if(vr_mob)
cleanup_vr_mob()
else
to_chat(usr, "<span class='warning'>The VR Sleeper's safeties prevent you from doing that.</span>")
. = TRUE
@@ -131,19 +128,22 @@
/obj/machinery/vr_sleeper/ui_data(mob/user)
var/list/data = list()
if(vr_human && !QDELETED(vr_human))
if(vr_mob && !QDELETED(vr_mob))
data["can_delete_avatar"] = TRUE
var/status
switch(vr_human.stat)
if(CONSCIOUS)
status = "Conscious"
if(DEAD)
status = "Dead"
if(UNCONSCIOUS)
status = "Unconscious"
if(SOFT_CRIT)
status = "Barely Conscious"
data["vr_avatar"] = list("name" = vr_human.name, "status" = status, "health" = vr_human.health, "maxhealth" = vr_human.maxHealth)
data["vr_avatar"] = list("name" = vr_mob.name)
data["isliving"] = istype(vr_mob)
if(data["isliving"])
var/status
switch(vr_mob.stat)
if(CONSCIOUS)
status = "Conscious"
if(DEAD)
status = "Dead"
if(UNCONSCIOUS)
status = "Unconscious"
if(SOFT_CRIT)
status = "Barely Conscious"
data["vr_avatar"] += list("status" = status, "health" = vr_mob.health, "maxhealth" = vr_mob.maxHealth)
data["toggle_open"] = state_open
data["emagged"] = you_die_in_the_game_you_die_for_real
data["isoccupant"] = (user == occupant)
@@ -157,40 +157,25 @@
for(var/obj/effect/landmark/vr_spawn/V in GLOB.landmarks_list)
GLOB.vr_spawnpoints[V.vr_category] = V
/obj/machinery/vr_sleeper/proc/build_virtual_human(mob/living/carbon/human/H, location, var/datum/outfit/outfit, transfer = TRUE)
if(H)
cleanup_vr_human()
vr_human = new /mob/living/carbon/human/virtual_reality(location)
vr_human.mind_initialize()
vr_human.vr_sleeper = src
vr_human.real_mind = H.mind
H.dna.transfer_identity(vr_human)
vr_human.name = H.name
vr_human.real_name = H.real_name
vr_human.socks = H.socks
vr_human.socks_color = H.socks_color
vr_human.undershirt = H.undershirt
vr_human.shirt_color = H.shirt_color
vr_human.underwear = H.underwear
vr_human.undie_color = H.undie_color
vr_human.updateappearance(TRUE, TRUE, TRUE)
vr_human.give_genitals(TRUE) //CITADEL ADD
if(outfit)
var/datum/outfit/O = new outfit()
O.equip(vr_human)
if(transfer && H.mind)
SStgui.close_user_uis(H, src)
H.audiovisual_redirect = vr_human
vr_human.ckey = H.ckey
/obj/machinery/vr_sleeper/proc/new_player(mob/living/carbon/human/H, location, datum/outfit/outfit, transfer = TRUE)
if(!H)
return
cleanup_vr_mob()
vr_mob = new virtual_mob_type(location)
if(vr_mob.build_virtual_character(H, outfit))
var/mob/living/carbon/human/vr_H = vr_mob
vr_H.updateappearance(TRUE, TRUE, TRUE)
if(!transfer || !H.mind)
return
vr_mob.AddComponent(/datum/component/virtual_reality, H, src, you_die_in_the_game_you_die_for_real)
/obj/machinery/vr_sleeper/proc/cleanup_vr_human()
if(vr_human)
vr_human.vr_sleeper = null // Prevents race condition where a new human could get created out of order and set to null.
QDEL_NULL(vr_human)
/obj/machinery/vr_sleeper/proc/cleanup_vr_mob()
if(vr_mob)
QDEL_NULL(vr_mob)
/obj/machinery/vr_sleeper/proc/emagNotify()
if(vr_human)
vr_human.Dizzy(10)
if(vr_mob)
vr_mob.Dizzy(10)
/obj/effect/landmark/vr_spawn //places you can spawn in VR, auto selected by the vr_sleeper during get_vr_spawnpoint()
var/vr_category = "default" //So we can have specific sleepers, eg: "Basketball VR Sleeper", etc.
@@ -222,6 +207,7 @@
color = "#00FF00"
invisibility = INVISIBILITY_ABSTRACT
var/area/vr_area
var/list/corpse_party
/obj/effect/vr_clean_master/Initialize()
. = ..()
@@ -234,7 +220,8 @@
qdel(casing)
for(var/obj/effect/decal/cleanable/C in vr_area)
qdel(C)
for (var/mob/living/carbon/human/virtual_reality/H in vr_area)
if (H.stat == DEAD && !H.vr_sleeper && !H.real_mind)
qdel(H)
for (var/A in corpse_party)
var/mob/M = A
if(get_area(M) == vr_area && M.stat == DEAD)
qdel(M)
addtimer(CALLBACK(src, .proc/clean_up), 3 MINUTES)
+1
View File
@@ -169,6 +169,7 @@ GLOBAL_LIST_INIT(admin_verbs_debug, world.AVerbsDebug())
/client/proc/cmd_display_overlay_log,
/client/proc/reload_configuration,
/datum/admins/proc/create_or_modify_area,
/client/proc/generate_wikichem_list //DO NOT PRESS UNLESS YOU WANT SUPERLAG
)
GLOBAL_PROTECT(admin_verbs_possess)
GLOBAL_LIST_INIT(admin_verbs_possess, list(/proc/possess, /proc/release))
+1 -1
View File
@@ -61,7 +61,7 @@
to_chat(body, "Your mob has been taken over by a ghost!")
message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(body)])")
body.ghostize(0)
body.key = C.key
C.transfer_ckey(body)
new /obj/effect/temp_visual/gravpush(get_turf(body))
/obj/effect/fun_balloon/sentience/emergency_shuttle
+2 -2
View File
@@ -458,7 +458,7 @@
SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Mass Braindamage"))
for(var/mob/living/carbon/human/H in GLOB.player_list)
to_chat(H, "<span class='boldannounce'>You suddenly feel stupid.</span>")
H.adjustBrainLoss(60, 80)
H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 60, 80)
message_admins("[key_name_admin(usr)] made everybody retarded")
if("eagles")//SCRAW
@@ -744,7 +744,7 @@
var/mob/chosen = players[1]
if (chosen.client)
chosen.client.prefs.copy_to(spawnedMob)
spawnedMob.key = chosen.key
chosen.transfer_ckey(spawnedMob)
players -= chosen
if (ishuman(spawnedMob) && ispath(humanoutfit, /datum/outfit))
var/mob/living/carbon/human/H = spawnedMob
+1 -1
View File
@@ -2042,7 +2042,7 @@
if(DEAD)
status = "<font color='red'><b>Dead</b></font>"
health_description = "Status = [status]"
health_description += "<BR>Oxy: [L.getOxyLoss()] - Tox: [L.getToxLoss()] - Fire: [L.getFireLoss()] - Brute: [L.getBruteLoss()] - Clone: [L.getCloneLoss()] - Brain: [L.getBrainLoss()] - Stamina: [L.getStaminaLoss()]"
health_description += "<BR>Oxy: [L.getOxyLoss()] - Tox: [L.getToxLoss()] - Fire: [L.getFireLoss()] - Brute: [L.getBruteLoss()] - Clone: [L.getCloneLoss()] - Brain: [L.getOrganLoss(ORGAN_SLOT_BRAIN)] - Stamina: [L.getStaminaLoss()]"
else
health_description = "This mob type has no health to speak of."
+1 -1
View File
@@ -306,7 +306,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
var/mob/living/silicon/pai/pai = new(card)
pai.name = input(choice, "Enter your pAI name:", "pAI Name", "Personal AI") as text
pai.real_name = pai.name
pai.key = choice.key
choice.transfer_ckey(pai)
card.setPersonality(pai)
for(var/datum/paiCandidate/candidate in SSpai.candidates)
if(candidate.key == choice.key)
+1 -1
View File
@@ -412,7 +412,7 @@
//Spawn the body
var/mob/living/carbon/human/ERTOperative = new ertemplate.mobtype(spawnloc)
chosen_candidate.client.prefs.copy_to(ERTOperative)
ERTOperative.key = chosen_candidate.key
chosen_candidate.transfer_ckey(ERTOperative)
if(ertemplate.enforce_human || ERTOperative.dna.species.dangerous_existence) // Don't want any exploding plasmemes
ERTOperative.set_species(/datum/species/human)
+4 -4
View File
@@ -384,7 +384,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
//Now to give them their mind back.
G_found.mind.transfer_to(new_xeno) //be careful when doing stuff like this! I've already checked the mind isn't in use
new_xeno.key = G_found.key
G_found.transfer_ckey(new_xeno, FALSE)
to_chat(new_xeno, "You have been fully respawned. Enjoy the game.")
var/msg = "<span class='adminnotice'>[key_name_admin(usr)] has respawned [new_xeno.key] as a filthy xeno.</span>"
message_admins(msg)
@@ -397,7 +397,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
var/mob/living/carbon/monkey/new_monkey = new
SSjob.SendToLateJoin(new_monkey)
G_found.mind.transfer_to(new_monkey) //be careful when doing stuff like this! I've already checked the mind isn't in use
new_monkey.key = G_found.key
G_found.transfer_ckey(new_monkey, FALSE)
to_chat(new_monkey, "You have been fully respawned. Enjoy the game.")
var/msg = "<span class='adminnotice'>[key_name_admin(usr)] has respawned [new_monkey.key] as a filthy xeno.</span>"
message_admins(msg)
@@ -437,7 +437,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(!new_character.mind.assigned_role)
new_character.mind.assigned_role = "Assistant"//If they somehow got a null assigned role.
new_character.key = G_found.key
G_found.transfer_ckey(new_character, FALSE)
/*
The code below functions with the assumption that the mob is already a traitor if they have a special role.
@@ -1264,7 +1264,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
target.electrocution_animation(40)
to_chat(target, "<span class='userdanger'>The gods have punished you for your sins!</span>")
if(ADMIN_PUNISHMENT_BRAINDAMAGE)
target.adjustBrainLoss(199, 199)
target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 199, 199)
if(ADMIN_PUNISHMENT_GIB)
target.gib(FALSE)
if(ADMIN_PUNISHMENT_BSA)
@@ -15,7 +15,7 @@ GLOBAL_LIST_EMPTY(antagonists)
var/antag_memory = ""//These will be removed with antag datum
var/antag_moodlet //typepath of moodlet that the mob will gain with their status
var/can_hijack = HIJACK_NEUTRAL //If these antags are alone on shuttle hijack happens.
//Antag panel properties
var/show_in_antagpanel = TRUE //This will hide adding this antag type in antag panel, use only for internal subtypes that shouldn't be added directly but still show if possessed by mind
var/antagpanel_category = "Uncategorized" //Antagpanel will display these together, REQUIRED
@@ -87,7 +87,7 @@ GLOBAL_LIST_EMPTY(antagonists)
to_chat(owner, "Your mob has been taken over by a ghost! Appeal your job ban if you want to avoid this in the future!")
message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(owner.current)]) to replace a jobbaned player.")
owner.current.ghostize(0)
owner.current.key = C.key
C.transfer_ckey(owner.current, FALSE)
/datum/antagonist/proc/on_removal()
remove_innate_effects()
@@ -52,5 +52,5 @@
/datum/outfit/abductor/scientist/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
..()
if(!visualsOnly)
var/obj/item/implant/abductor/beamplant = new /obj/item/implant/abductor(H)
var/obj/item/implant/abductor/beamplant = new
beamplant.implant(H)
@@ -160,7 +160,7 @@
if(2)
to_chat(H, "<span class='warning'>You hear an annoying buzz in your head.</span>")
H.confused += 15
H.adjustBrainLoss(10, 160)
H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 160)
if(3)
H.hallucination += 60
+1 -1
View File
@@ -172,7 +172,7 @@
blobber.adjustHealth(blobber.maxHealth * 0.5)
blob_mobs += blobber
var/mob/dead/observer/C = pick(candidates)
blobber.key = C.key
C.transfer_ckey(blobber)
SEND_SOUND(blobber, sound('sound/effects/blobattack.ogg'))
SEND_SOUND(blobber, sound('sound/effects/attackblob.ogg'))
to_chat(blobber, "<b>You are a blobbernaut!</b>")
@@ -83,7 +83,7 @@
if(istype(C))
var/obj/item/organ/brain/B = C.getorganslot(ORGAN_SLOT_BRAIN)
if(B && (B.decoy_override != initial(B.decoy_override)))
B.vital = TRUE
B.organ_flags |= ORGAN_VITAL
B.decoy_override = FALSE
remove_changeling_powers()
. = ..()
@@ -340,7 +340,7 @@
if(istype(C))
var/obj/item/organ/brain/B = C.getorganslot(ORGAN_SLOT_BRAIN)
if(B)
B.vital = FALSE
B.organ_flags &= ~ORGAN_VITAL
B.decoy_override = TRUE
update_changeling_icons_added()
return
@@ -35,7 +35,7 @@
B = new C.dna.species.mutant_brain()
else
B = new()
B.vital = FALSE
B.organ_flags &= ~ORGAN_VITAL
B.decoy_override = TRUE
B.Insert(C)
if(ishuman(user))
@@ -349,7 +349,7 @@
to_chat(L, "<span class='userdanger'>Your physical form has been taken over by another soul due to your inactivity! Ahelp if you wish to regain your form!</span>")
message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(L)]) to replace an inactive clock cultist.")
L.ghostize(0)
L.key = C.key
C.transfer_ckey(L, FALSE)
var/obj/effect/temp_visual/ratvar/sigil/vitality/V = new /obj/effect/temp_visual/ratvar/sigil/vitality(get_turf(src))
animate(V, alpha = 0, transform = matrix()*2, time = 8)
playsound(L, 'sound/magic/staff_healing.ogg', 50, 1)
@@ -50,7 +50,7 @@
to_chat(user, "<span class='userdanger'>The helmet tries to drive a spike through your head as you scramble to remove it!</span>")
user.emote("scream")
user.apply_damage(30, BRUTE, BODY_ZONE_HEAD)
user.adjustBrainLoss(30)
user.adjustOrganLoss(ORGAN_SLOT_BRAIN, 30)
addtimer(CALLBACK(user, /mob/living.proc/dropItemToGround, src, TRUE), 1) //equipped happens before putting stuff on(but not before picking items up), 1). thus, we need to wait for it to be on before forcing it off.
/obj/item/clothing/head/helmet/clockwork/mob_can_equip(mob/M, mob/equipper, slot, disable_warning = 0)
@@ -55,7 +55,7 @@
pre_spawn()
visible_message(creation_message)
var/mob/living/construct = new construct_type(get_turf(src))
construct.key = user.key
user.transfer_ckey(construct, FALSE)
post_spawn(construct)
qdel(user)
qdel(src)
@@ -216,6 +216,9 @@
if(is_reebe(invoker.z))
to_chat(invoker, "<span class='danger'>You're already at Reebe.</span>")
return
if(!isturf(invoker.loc))
to_chat(invoker, "<span class='danger'>You must be visible to return!</span>")
return
return TRUE
/datum/clockwork_scripture/abscond/recital()
@@ -64,7 +64,7 @@
message_admins("<span class='danger'>Admin [key_name_admin(user)] directly became the Eminence of the cult!</span>")
log_admin("Admin [key_name(user)] made themselves the Eminence.")
var/mob/camera/eminence/eminence = new(get_turf(src))
eminence.key = user.key
user.transfer_ckey(eminence, FALSE)
hierophant_message("<span class='bold large_brass'>Ratvar has directly assigned the Eminence!</span>")
for(var/mob/M in servants_and_ghosts())
M.playsound_local(M, 'sound/machines/clockcult/eminence_selected.ogg', 50, FALSE)
@@ -138,7 +138,7 @@
playsound(src, 'sound/machines/clockcult/ark_damage.ogg', 50, FALSE)
var/mob/camera/eminence/eminence = new(get_turf(src))
eminence_nominee = pick(candidates)
eminence.key = eminence_nominee.key
eminence_nominee.transfer_ckey(eminence)
hierophant_message("<span class='bold large_brass'>A ghost has ascended into the Eminence!</span>")
for(var/mob/M in servants_and_ghosts())
M.playsound_local(M, 'sound/machines/clockcult/eminence_selected.ogg', 50, FALSE)
@@ -45,7 +45,7 @@
return FALSE
var/mob/living/simple_animal/drone/cogscarab/ratvar/R = new/mob/living/simple_animal/drone/cogscarab/ratvar(get_turf(src))
R.visible_message("<span class='heavy_brass'>[R] forms, and its eyes blink open, glowing bright red!</span>")
R.key = O.key
O.transfer_ckey(R, FALSE)
/obj/structure/destructible/clockwork/massive/ratvar/Bump(atom/A)
var/turf/T = get_turf(A)
+16 -7
View File
@@ -4,6 +4,7 @@
desc = "Prepare blood magic by carving runes into your flesh. This rite is most effective with an <b>empowering rune</b>"
var/list/spells = list()
var/channeling = FALSE
var/holy_dispel = FALSE
/datum/action/innate/cult/blood_magic/Grant()
..()
@@ -33,6 +34,9 @@
B.button.moved = B.button.screen_loc
/datum/action/innate/cult/blood_magic/Activate()
if(holy_dispel)
to_chat(owner, "<span class='cultbold'>Holy water currently scours your body, nullifying the power of the rites!</span>")
return
var/rune = FALSE
var/limit = RUNELESS_MAX_BLOODCHARGE
for(var/obj/effect/rune/empower/R in range(1, owner))
@@ -64,7 +68,7 @@
qdel(nullify_spell)
return
BS = possible_spells[entered_spell_name]
if(QDELETED(src) || owner.incapacitated() || !BS || (rune && !(locate(/obj/effect/rune/empower) in range(1, owner))) || (spells.len >= limit))
if(QDELETED(src) || owner.incapacitated() || !BS || holy_dispel || (rune && !(locate(/obj/effect/rune/empower) in range(1, owner))) || (spells.len >= limit))
return
to_chat(owner,"<span class='warning'>You begin to carve unnatural symbols into your flesh!</span>")
SEND_SOUND(owner, sound('sound/weapons/slice.ogg',0,1,10))
@@ -73,7 +77,7 @@
else
to_chat(owner, "<span class='cultitalic'>You are already invoking blood magic!")
return
if(do_after(owner, 100 - rune*60, target = owner))
if(do_after(owner, 100 - rune*60, target = owner) && !holy_dispel)
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.bleed(40 - rune*32)
@@ -644,6 +648,11 @@
desc = "A spell that will absorb blood from anything you touch.<br>Touching cultists and constructs can heal them.<br><b>Clicking the hand will potentially let you focus the spell into something stronger.</b>"
color = "#7D1717"
/obj/item/melee/blood_magic/manipulator/examine(mob/user)
. = ..()
if(iscultist(user))
to_chat(user, "<span class='cultitalic'>The [name] currently has <b>[uses]</b> blood charges left.</span>")
/obj/item/melee/blood_magic/manipulator/afterattack(atom/target, mob/living/carbon/human/user, proximity)
if(proximity)
if(ishuman(target))
@@ -678,9 +687,9 @@
if(ratio>1)
ratio = 1
uses -= round(overall_damage)
H.visible_message("<span class='warning'>[H] is fully healed by [H==user ? "[H.p_their()]":"[H]'s"]'s blood magic!</span>")
H.visible_message("<span class='warning'>[H] is fully healed by [H==user ? "[H.p_their()]":"[user]'s"] blood magic!</span>")
else
H.visible_message("<span class='warning'>[H] is partially healed by [H==user ? "[H.p_their()]":"[H]'s"] blood magic.</span>")
H.visible_message("<span class='warning'>[H] is partially healed by [H==user ? "[H.p_their()]":"[user]'s"] blood magic.</span>")
uses = 0
ratio *= -1
H.adjustOxyLoss((overall_damage*ratio) * (H.getOxyLoss() / overall_damage), 0)
@@ -762,7 +771,7 @@
switch(choice)
if("Blood Spear (150)")
if(uses < 150)
to_chat(user, "<span class='cultitalic'>You need 200 charges to perform this rite.</span>")
to_chat(user, "<span class='cultitalic'>You need 150 charges to perform this rite.</span>")
else
uses -= 150
var/turf/T = get_turf(user)
@@ -778,7 +787,7 @@
"<span class='cultitalic'>A [rite.name] materializes at your feet.</span>")
if("Blood Bolt Barrage (300)")
if(uses < 300)
to_chat(user, "<span class='cultitalic'>You need 400 charges to perform this rite.</span>")
to_chat(user, "<span class='cultitalic'>You need 300 charges to perform this rite.</span>")
else
var/obj/rite = new /obj/item/gun/ballistic/shotgun/boltaction/enchanted/arcane_barrage/blood()
uses -= 300
@@ -790,7 +799,7 @@
qdel(rite)
if("Blood Beam (500)")
if(uses < 500)
to_chat(user, "<span class='cultitalic'>You need 600 charges to perform this rite.</span>")
to_chat(user, "<span class='cultitalic'>You need 500 charges to perform this rite.</span>")
else
var/obj/rite = new /obj/item/blood_beam()
uses -= 500
@@ -666,6 +666,7 @@
righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi'
slot_flags = 0
force = 17
force_unwielded = 17
force_wielded = 24
throwforce = 40
throw_speed = 2
@@ -73,6 +73,10 @@
animate(src, color = previouscolor, time = 8)
addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 8)
/obj/structure/destructible/cult/proc/check_menu(mob/living/user)
if(!user || user.incapacitated() || !iscultist(user) || !anchored || cooldowntime > world.time)
return FALSE
return TRUE
/obj/structure/destructible/cult/talisman
name = "altar"
@@ -80,9 +84,18 @@
icon_state = "talismanaltar"
break_message = "<span class='warning'>The altar shatters, leaving only the wailing of the damned!</span>"
/obj/structure/destructible/cult/talisman/attack_hand(mob/living/user)
var/static/image/radial_whetstone = image(icon = 'icons/obj/kitchen.dmi', icon_state = "cult_sharpener")
var/static/image/radial_shell = image(icon = 'icons/obj/wizard.dmi', icon_state = "construct-cult")
var/static/image/radial_unholy_water = image(icon = 'icons/obj/drinks.dmi', icon_state = "holyflask")
/obj/structure/destructible/cult/talisman/Initialize()
. = ..()
if(.)
radial_unholy_water.color = "#333333"
/obj/structure/destructible/cult/talisman/ui_interact(mob/user)
. = ..()
if(!user.canUseTopic(src, TRUE))
return
if(!iscultist(user))
to_chat(user, "<span class='warning'>You're pretty sure you know exactly what this is used for and you can't seem to touch it.</span>")
@@ -91,22 +104,27 @@
to_chat(user, "<span class='cultitalic'>You need to anchor [src] to the floor with your dagger first.</span>")
return
if(cooldowntime > world.time)
to_chat(user, "<span class='cult italic'>The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].</span>")
to_chat(user, "<span class='cultitalic'>The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].</span>")
return
var/choice = alert(user,"You study the schematics etched into the altar...",,"Eldritch Whetstone","Construct Shell","Flask of Unholy Water")
var/list/pickedtype = list()
to_chat(user, "<span class='cultitalic'>You study the schematics etched into the altar...</span>")
var/list/options = list("Eldritch Whetstone" = radial_whetstone, "Construct Shell" = radial_shell, "Flask of Unholy Water" = radial_unholy_water)
var/choice = show_radial_menu(user, src, options, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
var/reward
switch(choice)
if("Eldritch Whetstone")
pickedtype += /obj/item/sharpener/cult
reward = /obj/item/sharpener/cult
if("Construct Shell")
pickedtype += /obj/structure/constructshell
reward = /obj/structure/constructshell
if("Flask of Unholy Water")
pickedtype += /obj/item/reagent_containers/glass/beaker/unholywater
if(src && !QDELETED(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
reward = /obj/item/reagent_containers/glass/beaker/unholywater
if(!QDELETED(src) && reward && check_menu(user))
cooldowntime = world.time + 2400
for(var/N in pickedtype)
new N(get_turf(src))
to_chat(user, "<span class='cultitalic'>You kneel before the altar and your faith is rewarded with the [choice]!</span>")
new reward(get_turf(src))
to_chat(user, "<span class='cultitalic'>You kneel before the altar and your faith is rewarded with the [choice]!</span>")
/obj/structure/destructible/cult/forge
name = "daemon forge"
@@ -116,9 +134,14 @@
light_color = LIGHT_COLOR_LAVA
break_message = "<span class='warning'>The force breaks apart into shards with a howling scream!</span>"
/obj/structure/destructible/cult/forge/attack_hand(mob/living/user)
var/static/image/radial_flagellant = image(icon = 'icons/obj/clothing/suits.dmi', icon_state = "cultrobes")
var/static/image/radial_shielded = image(icon = 'icons/obj/clothing/suits.dmi', icon_state = "cult_armor")
var/static/image/radial_mirror = image(icon = 'icons/obj/items_and_weapons.dmi', icon_state = "mirror_shield")
/obj/structure/destructible/cult/forge/ui_interact(mob/user)
. = ..()
if(.)
if(!user.canUseTopic(src, TRUE))
return
if(!iscultist(user))
to_chat(user, "<span class='warning'>The heat radiating from [src] pushes you back.</span>")
@@ -129,24 +152,26 @@
if(cooldowntime > world.time)
to_chat(user, "<span class='cult italic'>The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].</span>")
return
var/choice
if(user.mind.has_antag_datum(/datum/antagonist/cult/master))
choice = alert(user,"You study the schematics etched into the forge...",,"Shielded Robe","Flagellant's Robe","Mirror Shield")
else
choice = alert(user,"You study the schematics etched into the forge...",,"Shielded Robe","Flagellant's Robe","Mirror Shield")
var/list/pickedtype = list()
to_chat(user, "<span class='cultitalic'>You study the schematics etched into the forge...</span>")
var/list/options = list("Shielded Robe" = radial_shielded, "Flagellant's Robe" = radial_flagellant, "Mirror Shield" = radial_mirror)
var/choice = show_radial_menu(user, src, options, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
var/reward
switch(choice)
if("Shielded Robe")
pickedtype += /obj/item/clothing/suit/hooded/cultrobes/cult_shield
reward = /obj/item/clothing/suit/hooded/cultrobes/cult_shield
if("Flagellant's Robe")
pickedtype += /obj/item/clothing/suit/hooded/cultrobes/berserker
reward = /obj/item/clothing/suit/hooded/cultrobes/berserker
if("Mirror Shield")
pickedtype += /obj/item/shield/mirror
if(src && !QDELETED(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
reward = /obj/item/shield/mirror
if(!QDELETED(src) && reward && check_menu(user))
cooldowntime = world.time + 2400
for(var/N in pickedtype)
new N(get_turf(src))
to_chat(user, "<span class='cultitalic'>You work the forge as dark knowledge guides your hands, creating the [choice]!</span>")
new reward(get_turf(src))
to_chat(user, "<span class='cultitalic'>You work the forge as dark knowledge guides your hands, creating the [choice]!</span>")
@@ -234,9 +259,14 @@
light_color = LIGHT_COLOR_FIRE
break_message = "<span class='warning'>The books and tomes of the archives burn into ash as the desk shatters!</span>"
/obj/structure/destructible/cult/tome/attack_hand(mob/living/user)
var/static/image/radial_blindfold = image(icon = 'icons/obj/clothing/glasses.dmi', icon_state = "blindfold")
var/static/image/radial_curse = image(icon = 'icons/obj/cult.dmi', icon_state ="shuttlecurse")
var/static/image/radial_veilwalker = image(icon = 'icons/obj/cult.dmi', icon_state ="shifter")
/obj/structure/destructible/cult/tome/ui_interact(mob/user)
. = ..()
if(.)
if(!user.canUseTopic(src, TRUE))
return
if(!iscultist(user))
to_chat(user, "<span class='warning'>These books won't open and it hurts to even try and read the covers.</span>")
@@ -247,21 +277,27 @@
if(cooldowntime > world.time)
to_chat(user, "<span class='cult italic'>The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].</span>")
return
var/choice = alert(user,"You flip through the black pages of the archives...",,"Zealot's Blindfold","Shuttle Curse","Veil Walker Set")
var/list/pickedtype = list()
to_chat(user, "<span class='cultitalic'>You flip through the black pages of the archives...</span>")
var/list/options = list("Zealot's Blindfold" = radial_blindfold, "Shuttle Curse" = radial_curse, "Veil Walker Set" = radial_veilwalker)
var/choice = show_radial_menu(user, src, options, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
var/reward
switch(choice)
if("Zealot's Blindfold")
pickedtype += /obj/item/clothing/glasses/hud/health/night/cultblind
reward = /obj/item/clothing/glasses/hud/health/night/cultblind
if("Shuttle Curse")
pickedtype += /obj/item/shuttle_curse
reward = /obj/item/shuttle_curse
if("Veil Walker Set")
pickedtype += /obj/item/cult_shift
pickedtype += /obj/item/flashlight/flare/culttorch
if(src && !QDELETED(src) && anchored && pickedtype.len && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
reward = /obj/effect/spawner/bundle/veil_walker
if(!QDELETED(src) && reward && check_menu(user))
cooldowntime = world.time + 2400
for(var/N in pickedtype)
new N(get_turf(src))
to_chat(user, "<span class='cultitalic'>You summon the [choice] from the archives!</span>")
new reward(get_turf(src))
to_chat(user, "<span class='cultitalic'>You summon the [choice] from the archives!</span>")
/obj/effect/spawner/bundle/veil_walker
items = list(/obj/item/cult_shift, /obj/item/flashlight/flare/culttorch)
/obj/effect/gateway
name = "gateway"
+9 -44
View File
@@ -185,9 +185,6 @@ structure_check() searches for nearby cultist structures required for the invoca
color = RUNE_COLOR_OFFER
req_cultists = 1
rune_in_use = FALSE
var/mob/living/currentconversionman
var/conversiontimeout
var/conversionresult
/obj/effect/rune/convert/do_invoke_glow()
return
@@ -233,37 +230,18 @@ structure_check() searches for nearby cultist structures required for the invoca
addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 5)
Cult_team.check_size() // Triggers the eye glow or aura effects if the cult has grown large enough relative to the crew
rune_in_use = FALSE
/obj/effect/rune/convert/proc/do_convert(mob/living/convertee, list/invokers)
if(invokers.len < 2)
for(var/M in invokers)
to_chat(M, "<span class='danger'>You need at least two invokers to convert [convertee]!</span>")
to_chat(M, "<span class='warning'>You need at least two invokers to convert [convertee]!</span>")
log_game("Offer rune failed - tried conversion with one invoker")
return 0
if(convertee.anti_magic_check(TRUE, TRUE))
if(convertee.anti_magic_check(TRUE, TRUE, FALSE, 0)) //Not chargecost because it can be spammed
for(var/M in invokers)
to_chat(M, "<span class='warning'>Something is shielding [convertee]'s mind!</span>")
log_game("Offer rune failed - convertee had anti-magic")
return 0
to_chat(convertee, "<span class='cult italic'><b>The world goes red. All at once you are aware of an evil, eldritch truth taking roots into your mind.\n\
<a href='?src=\ref[src];signmeup=1'>Click here to become a follower of Nar'sie</a></b>, or suffer a fate worse than death.</span>")
INVOKE_ASYNC(src, .proc/optinalert, convertee)
currentconversionman = convertee
conversiontimeout = world.time + (14 SECONDS)
convertee.Stun(140)
ADD_TRAIT(convertee, TRAIT_MUTE, "conversionrune")
flash_color(convertee, list("#960000", "#960000", "#960000", rgb(0,0,0)), 50)
conversionresult = FALSE
while(world.time < conversiontimeout && convertee && !conversionresult)
stoplag(1)
currentconversionman = null
if(!convertee)
return FALSE
REMOVE_TRAIT(convertee, TRAIT_MUTE, "conversionrune")
if(get_turf(convertee) != get_turf(src))
return FALSE
if(!conversionresult)
do_sacrifice(convertee, invokers, TRUE)
return FALSE
var/brutedamage = convertee.getBruteLoss()
var/burndamage = convertee.getFireLoss()
if(brutedamage || burndamage)
@@ -275,6 +253,8 @@ structure_check() searches for nearby cultist structures required for the invoca
SSticker.mode.add_cultist(convertee.mind, 1)
new /obj/item/melee/cultblade/dagger(get_turf(src))
convertee.mind.special_role = ROLE_CULTIST
to_chat(convertee, "<span class='cult italic'><b>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible, truth. The veil of reality has been ripped away \
and something evil takes root.</b></span>")
to_chat(convertee, "<span class='cult italic'><b>Assist your new compatriots in their dark dealings. Your goal is theirs, and theirs is yours. You serve the Geometer above all else. Bring it back.\
</b></span>")
if(ishuman(convertee))
@@ -284,18 +264,7 @@ structure_check() searches for nearby cultist structures required for the invoca
H.cultslurring = 0
return 1
/obj/effect/rune/convert/proc/optinalert(mob/living/convertee)
var/alert = alert(convertee, "Will you embrace the Geometer of Blood or perish in futile resistance?", "Choose your own fate", "Join the Blood Cult", "Suffer a horrible demise")
if(src && alert == "Join the Blood Cult")
signmeup(convertee)
/obj/effect/rune/convert/proc/signmeup(mob/living/convertee)
if(currentconversionman == convertee)
conversionresult = TRUE
else
to_chat(convertee, "<span class='cult italic'>Your fate has already been set in stone.</span>")
/obj/effect/rune/convert/proc/do_sacrifice(mob/living/sacrificial, list/invokers, force_a_sac)
/obj/effect/rune/convert/proc/do_sacrifice(mob/living/sacrificial, list/invokers)
var/mob/living/first_invoker = invokers[1]
if(!first_invoker)
return FALSE
@@ -305,7 +274,7 @@ structure_check() searches for nearby cultist structures required for the invoca
var/big_sac = FALSE
if(!force_a_sac && (((ishuman(sacrificial) || iscyborg(sacrificial)) && sacrificial.stat != DEAD) || C.cult_team.is_sacrifice_target(sacrificial.mind)) && invokers.len < 3)
if((((ishuman(sacrificial) || iscyborg(sacrificial)) && sacrificial.stat != DEAD) || C.cult_team.is_sacrifice_target(sacrificial.mind)) && invokers.len < 3)
for(var/M in invokers)
to_chat(M, "<span class='cult italic'>[sacrificial] is too greatly linked to the world! You need three acolytes!</span>")
log_game("Offer rune failed - not enough acolytes and target is living or sac target")
@@ -345,10 +314,6 @@ structure_check() searches for nearby cultist structures required for the invoca
sacrificial.gib()
return TRUE
/obj/effect/rune/convert/Topic(href, href_list)
if(href_list["signmeup"])
signmeup(usr)
/obj/effect/rune/empower
cultist_name = "Empower"
cultist_desc = "allows cultists to prepare greater amounts of blood magic at far less of a cost."
@@ -610,7 +575,7 @@ structure_check() searches for nearby cultist structures required for the invoca
to_chat(mob_to_revive.mind, "Your physical form has been taken over by another soul due to your inactivity! Ahelp if you wish to regain your form.")
message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(mob_to_revive)]) to replace an AFK player.")
mob_to_revive.ghostize(0)
mob_to_revive.key = C.key
C.transfer_ckey(mob_to_revive, FALSE)
else
fail_invoke()
return
@@ -905,7 +870,7 @@ structure_check() searches for nearby cultist structures required for the invoca
visible_message("<span class='warning'>A cloud of red mist forms above [src], and from within steps... a [new_human.gender == FEMALE ? "wo":""]man.</span>")
to_chat(user, "<span class='cultitalic'>Your blood begins flowing into [src]. You must remain in place and conscious to maintain the forms of those summoned. This will hurt you slowly but surely...</span>")
var/obj/structure/emergency_shield/invoker/N = new(T)
new_human.key = ghost_to_spawn.key
ghost_to_spawn.transfer_ckey(new_human, FALSE)
SSticker.mode.add_cultist(new_human.mind, 0)
to_chat(new_human, "<span class='cultitalic'><b>You are a servant of the Geometer. You have been made semi-corporeal by the cult of Nar'Sie, and you are to serve them at all costs.</b></span>")
@@ -146,7 +146,7 @@
/mob/living/carbon/true_devil/attack_ghost(mob/dead/observer/user as mob)
if(ascended || user.mind.soulOwner == src.mind)
var/mob/living/simple_animal/imp/S = new(get_turf(loc))
S.key = user.key
user.transfer_ckey(S, FALSE)
S.mind.assigned_role = "Imp"
S.mind.special_role = "Imp"
var/datum/objective/newobjective = new
@@ -5,25 +5,48 @@ is currently following.
*/
GLOBAL_LIST_INIT(disease_ability_singletons, list(
new /datum/disease_ability/action/cough(),
new /datum/disease_ability/action/sneeze(),
new /datum/disease_ability/action/infect(),
new /datum/disease_ability/symptom/cough(),
new /datum/disease_ability/symptom/sneeze(),\
new /datum/disease_ability/symptom/hallucigen(),
new /datum/disease_ability/symptom/choking(),
new /datum/disease_ability/symptom/confusion(),
new /datum/disease_ability/symptom/youth(),
new /datum/disease_ability/symptom/vomit(),
new /datum/disease_ability/symptom/voice_change(),
new /datum/disease_ability/symptom/visionloss(),
new /datum/disease_ability/symptom/viraladaptation(),
new /datum/disease_ability/symptom/vitiligo(),
new /datum/disease_ability/symptom/sensory_restoration(),
new /datum/disease_ability/symptom/itching(),
new /datum/disease_ability/symptom/weight_loss(),
new /datum/disease_ability/symptom/metabolism_heal(),
new /datum/disease_ability/symptom/coma_heal()
new /datum/disease_ability/action/cough,
new /datum/disease_ability/action/sneeze,
new /datum/disease_ability/action/infect,
new /datum/disease_ability/symptom/mild/cough,
new /datum/disease_ability/symptom/mild/sneeze,
new /datum/disease_ability/symptom/medium/shedding,
new /datum/disease_ability/symptom/medium/beard,
new /datum/disease_ability/symptom/medium/hallucigen,
new /datum/disease_ability/symptom/medium/choking,
new /datum/disease_ability/symptom/medium/confusion,
new /datum/disease_ability/symptom/medium/vomit,
new /datum/disease_ability/symptom/medium/voice_change,
new /datum/disease_ability/symptom/medium/visionloss,
new /datum/disease_ability/symptom/medium/deafness,
new /datum/disease_ability/symptom/powerful/narcolepsy,
new /datum/disease_ability/symptom/medium/fever,
new /datum/disease_ability/symptom/medium/shivering,
new /datum/disease_ability/symptom/medium/headache,
new /datum/disease_ability/symptom/medium/nano_boost,
new /datum/disease_ability/symptom/medium/nano_destroy,
new /datum/disease_ability/symptom/medium/viraladaptation,
new /datum/disease_ability/symptom/medium/viralevolution,
new /datum/disease_ability/symptom/medium/vitiligo,
new /datum/disease_ability/symptom/medium/revitiligo,
new /datum/disease_ability/symptom/medium/itching,
new /datum/disease_ability/symptom/medium/heal/weight_loss,
new /datum/disease_ability/symptom/medium/heal/sensory_restoration,
new /datum/disease_ability/symptom/medium/heal/mind_restoration,
new /datum/disease_ability/symptom/powerful/fire,
new /datum/disease_ability/symptom/powerful/flesh_eating,
// new /datum/disease_ability/symptom/powerful/genetic_mutation,
new /datum/disease_ability/symptom/powerful/inorganic_adaptation,
new /datum/disease_ability/symptom/powerful/heal/starlight,
new /datum/disease_ability/symptom/powerful/heal/oxygen,
new /datum/disease_ability/symptom/powerful/heal/chem,
new /datum/disease_ability/symptom/powerful/heal/metabolism,
new /datum/disease_ability/symptom/powerful/heal/dark,
new /datum/disease_ability/symptom/powerful/heal/water,
new /datum/disease_ability/symptom/powerful/heal/plasma,
new /datum/disease_ability/symptom/powerful/heal/radiation,
new /datum/disease_ability/symptom/powerful/heal/coma,
new /datum/disease_ability/symptom/powerful/youth
))
/datum/disease_ability
@@ -54,7 +77,13 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
stage_speed += initial(S.stage_speed)
transmittable += initial(S.transmittable)
threshold_block += "<br><br>[initial(S.threshold_desc)]"
stat_block = "Resistance: [resistance]<br>Stealth: [stealth]<br>Stage Speed: [stage_speed]<br>Transmissibility: [transmittable]<br><br>"
stat_block = "Resistance: [resistance]<br>Stealth: [stealth]<br>Stage Speed: [stage_speed]<br>Transmissibility: [transmittable]<br><br>"
if(symptoms.len == 1) //lazy boy's dream
name = initial(S.name)
if(short_desc == "")
short_desc = initial(S.desc)
if(long_desc == "")
long_desc = initial(S.desc)
/datum/disease_ability/proc/CanBuy(mob/camera/disease/D)
if(world.time < D.next_adaptation_time)
@@ -77,8 +106,10 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
for(var/T in symptoms)
var/datum/symptom/S = new T()
SD.symptoms += S
S.OnAdd(SD)
if(SD.processing)
S.Start(SD)
if(S.Start(SD))
S.next_activation = world.time + rand(S.symptom_delay_min * 10, S.symptom_delay_max * 10)
SD.Refresh()
for(var/T in actions)
var/datum/action/A = new T()
@@ -105,6 +136,7 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
var/datum/symptom/S = locate(T) in SD.symptoms
if(S)
SD.symptoms -= S
S.OnRemove(SD)
if(SD.processing)
S.End(SD)
qdel(S)
@@ -152,8 +184,9 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
return FALSE
to_chat(D, "<span class='notice'>You force [L.real_name] to cough.</span>")
L.emote("cough")
var/datum/disease/advance/sentient_disease/SD = D.hosts[L]
SD.spread(2)
if(L.CanSpreadAirborneDisease()) //don't spread germs if they covered their mouth
var/datum/disease/advance/sentient_disease/SD = D.hosts[L]
SD.spread(2)
StartCooldown()
return TRUE
@@ -185,11 +218,12 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
return FALSE
to_chat(D, "<span class='notice'>You force [L.real_name] to sneeze.</span>")
L.emote("sneeze")
var/datum/disease/advance/sentient_disease/SD = D.hosts[L]
if(L.CanSpreadAirborneDisease()) //don't spread germs if they covered their mouth
var/datum/disease/advance/sentient_disease/SD = D.hosts[L]
for(var/mob/living/M in oview(4, SD.affected_mob))
if(is_A_facing_B(SD.affected_mob, M) && disease_air_spread_walk(get_turf(SD.affected_mob), get_turf(M)))
M.AirborneContractDisease(SD, TRUE)
for(var/mob/living/M in oview(4, SD.affected_mob))
if(is_A_facing_B(SD.affected_mob, M) && disease_air_spread_walk(get_turf(SD.affected_mob), get_turf(M)))
M.AirborneContractDisease(SD, TRUE)
StartCooldown()
return TRUE
@@ -235,154 +269,192 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
StartCooldown()
return TRUE
//passive symptom abilities
/*******************BASE SYMPTOM TYPES*******************/
// cost is for convenience and can be changed. If you're changing req_tot_points then don't use the subtype...
//healing costs more so you have to techswitch from naughty disease otherwise we'd have friendly disease for easy greentext (no fun!)
/datum/disease_ability/symptom/cough
name = "Involuntary Coughing"
symptoms = list(/datum/symptom/cough)
/datum/disease_ability/symptom/mild
cost = 2
required_total_points = 4
category = "Symptom (Weak)"
/datum/disease_ability/symptom/medium
cost = 4
required_total_points = 8
category = "Symptom"
/datum/disease_ability/symptom/medium/heal
cost = 5
category = "Symptom (+)"
/datum/disease_ability/symptom/powerful
cost = 4
required_total_points = 16
category = "Symptom (Strong)"
/datum/disease_ability/symptom/powerful/heal
cost = 8
category = "Symptom (Strong+)"
/******MILD******/
/datum/disease_ability/symptom/mild/cough
name = "Involuntary Coughing"
symptoms = list(/datum/symptom/cough)
short_desc = "Cause victims to cough intermittently."
long_desc = "Cause victims to cough intermittently, spreading your infection if your transmissibility is high."
/datum/disease_ability/symptom/sneeze
/datum/disease_ability/symptom/mild/sneeze
name = "Involuntary Sneezing"
symptoms = list(/datum/symptom/sneeze)
cost = 2
required_total_points = 4
short_desc = "Cause victims to sneeze intermittently."
long_desc = "Cause victims to sneeze intermittently, spreading your infection and also increasing transmissibility and resistance, at the cost of stealth."
/datum/disease_ability/symptom/beard
//I don't think I need to justify the fact that this is the best symptom
name = "Beard Growth"
symptoms = list(/datum/symptom/beard)
cost = 1
required_total_points = 8
short_desc = "Cause all victims to grow a luscious beard."
long_desc = "Cause all victims to grow a luscious beard. Decreases stats slightly. Ineffective against Santa Claus."
/******MEDIUM******/
/datum/disease_ability/symptom/hallucigen
name = "Hallucinations"
/datum/disease_ability/symptom/medium/shedding
symptoms = list(/datum/symptom/shedding)
/datum/disease_ability/symptom/medium/beard
symptoms = list(/datum/symptom/beard)
short_desc = "Cause all victims to grow a luscious beard."
long_desc = "Cause all victims to grow a luscious beard. Ineffective against Santa Claus."
/datum/disease_ability/symptom/medium/hallucigen
symptoms = list(/datum/symptom/hallucigen)
cost = 4
required_total_points = 8
short_desc = "Cause victims to hallucinate."
long_desc = "Cause victims to hallucinate. Decreases stats, especially resistance."
/datum/disease_ability/symptom/choking
name = "Choking"
/datum/disease_ability/symptom/medium/choking
symptoms = list(/datum/symptom/choking)
cost = 4
required_total_points = 8
short_desc = "Cause victims to choke."
long_desc = "Cause victims to choke, threatening asphyxiation. Decreases stats, especially transmissibility."
/datum/disease_ability/symptom/confusion
name = "Confusion"
/datum/disease_ability/symptom/medium/confusion
symptoms = list(/datum/symptom/confusion)
cost = 4
required_total_points = 8
short_desc = "Cause victims to become confused."
long_desc = "Cause victims to become confused intermittently."
/datum/disease_ability/symptom/youth
name = "Eternal Youth"
symptoms = list(/datum/symptom/youth)
cost = 4
required_total_points = 8
short_desc = "Cause victims to become eternally young."
long_desc = "Cause victims to become eternally young. Provides boosts to all stats except transmissibility."
/datum/disease_ability/symptom/vomit
name = "Vomiting"
/datum/disease_ability/symptom/medium/vomit
symptoms = list(/datum/symptom/vomit)
cost = 4
required_total_points = 8
short_desc = "Cause victims to vomit."
long_desc = "Cause victims to vomit. Slightly increases transmissibility. Vomiting also also causes the victims to lose nutrition and removes some toxin damage."
/datum/disease_ability/symptom/voice_change
name = "Voice Changing"
/datum/disease_ability/symptom/medium/voice_change
symptoms = list(/datum/symptom/voice_change)
cost = 4
required_total_points = 8
short_desc = "Change the voice of victims."
long_desc = "Change the voice of victims, causing confusion in communications."
/datum/disease_ability/symptom/visionloss
name = "Vision Loss"
/datum/disease_ability/symptom/medium/visionloss
symptoms = list(/datum/symptom/visionloss)
cost = 4
required_total_points = 8
short_desc = "Damage the eyes of victims, eventually causing blindness."
long_desc = "Damage the eyes of victims, eventually causing blindness. Decreases all stats."
/datum/disease_ability/symptom/medium/deafness
symptoms = list(/datum/symptom/deafness)
/datum/disease_ability/symptom/viraladaptation
name = "Self-Adaptation"
/datum/disease_ability/symptom/medium/fever
symptoms = list(/datum/symptom/fever)
/datum/disease_ability/symptom/medium/shivering
symptoms = list(/datum/symptom/shivering)
/datum/disease_ability/symptom/medium/headache
symptoms = list(/datum/symptom/headache)
/datum/disease_ability/symptom/medium/nano_boost
symptoms = list(/datum/symptom/nano_boost)
/datum/disease_ability/symptom/medium/nano_destroy
symptoms = list(/datum/symptom/nano_destroy)
/datum/disease_ability/symptom/medium/viraladaptation
symptoms = list(/datum/symptom/viraladaptation)
cost = 4
required_total_points = 8
short_desc = "Cause your infection to become more resistant to detection and eradication."
long_desc = "Cause your infection to mimic the function of normal body cells, becoming much harder to spot and to eradicate, but reducing its speed."
/datum/disease_ability/symptom/medium/viralevolution
symptoms = list(/datum/symptom/viralevolution)
/datum/disease_ability/symptom/vitiligo
name = "Skin Paleness"
/datum/disease_ability/symptom/medium/vitiligo
symptoms = list(/datum/symptom/vitiligo)
cost = 1
required_total_points = 8
short_desc = "Cause victims to become pale."
long_desc = "Cause victims to become pale. Decreases all stats."
/datum/disease_ability/symptom/medium/revitiligo
symptoms = list(/datum/symptom/revitiligo)
/datum/disease_ability/symptom/sensory_restoration
name = "Sensory Restoration"
symptoms = list(/datum/symptom/sensory_restoration)
cost = 4
required_total_points = 8
short_desc = "Regenerate eye and ear damage of victims."
long_desc = "Regenerate eye and ear damage of victims."
/datum/disease_ability/symptom/itching
name = "Itching"
/datum/disease_ability/symptom/medium/itching
symptoms = list(/datum/symptom/itching)
cost = 4
required_total_points = 8
short_desc = "Cause victims to itch."
long_desc = "Cause victims to itch, increasing all stats except stealth."
/datum/disease_ability/symptom/weight_loss
name = "Weight Loss"
/datum/disease_ability/symptom/medium/heal/weight_loss
symptoms = list(/datum/symptom/weight_loss)
cost = 4
required_total_points = 8
short_desc = "Cause victims to lose weight."
long_desc = "Cause victims to lose weight, and make it almost impossible for them to gain nutrition from food. Reduced nutrition allows your infection to spread more easily from hosts, especially by sneezing."
/datum/disease_ability/symptom/medium/heal/sensory_restoration
symptoms = list(/datum/symptom/sensory_restoration)
short_desc = "Regenerate eye and ear damage of victims."
long_desc = "Regenerate eye and ear damage of victims."
/datum/disease_ability/symptom/metabolism_heal
name = "Metabolic Boost"
/datum/disease_ability/symptom/medium/heal/mind_restoration
symptoms = list(/datum/symptom/mind_restoration)
/******POWERFUL******/
/datum/disease_ability/symptom/powerful/fire
symptoms = list(/datum/symptom/fire)
/datum/disease_ability/symptom/powerful/flesh_eating
symptoms = list(/datum/symptom/flesh_eating)
/*
/datum/disease_ability/symptom/powerful/genetic_mutation
symptoms = list(/datum/symptom/genetic_mutation)
cost = 8
*/
/datum/disease_ability/symptom/powerful/inorganic_adaptation
symptoms = list(/datum/symptom/inorganic_adaptation)
/datum/disease_ability/symptom/powerful/narcolepsy
symptoms = list(/datum/symptom/narcolepsy)
/datum/disease_ability/symptom/powerful/youth
symptoms = list(/datum/symptom/youth)
short_desc = "Cause victims to become eternally young."
long_desc = "Cause victims to become eternally young. Provides boosts to all stats except transmissibility."
/****HEALING SUBTYPE****/
/datum/disease_ability/symptom/powerful/heal/starlight
symptoms = list(/datum/symptom/heal/starlight)
/datum/disease_ability/symptom/powerful/heal/oxygen
symptoms = list(/datum/symptom/oxygen)
/datum/disease_ability/symptom/powerful/heal/chem
symptoms = list(/datum/symptom/heal/chem)
/datum/disease_ability/symptom/powerful/heal/metabolism
symptoms = list(/datum/symptom/heal/metabolism)
cost = 4
required_total_points = 16
short_desc = "Increase the metabolism of victims, causing them to process chemicals and grow hungry faster."
long_desc = "Increase the metabolism of victims, causing them to process chemicals twice as fast and grow hungry more quickly."
/datum/disease_ability/symptom/powerful/heal/dark
symptoms = list(/datum/symptom/heal/darkness)
/datum/disease_ability/symptom/coma_heal
name = "Regenerative Coma"
/datum/disease_ability/symptom/powerful/heal/water
symptoms = list(/datum/symptom/heal/water)
/datum/disease_ability/symptom/powerful/heal/plasma
symptoms = list(/datum/symptom/heal/plasma)
/datum/disease_ability/symptom/powerful/heal/radiation
symptoms = list(/datum/symptom/heal/radiation)
/datum/disease_ability/symptom/powerful/heal/coma
symptoms = list(/datum/symptom/heal/coma)
cost = 8
required_total_points = 16
short_desc = "Cause victims to fall into a healing coma when hurt."
long_desc = "Cause victims to fall into a healing coma when hurt."
@@ -51,6 +51,7 @@
if(cures.len)
return
var/list/not_used = advance_cures.Copy()
not_used.Cut(1, 6) // Removes the first five tiers of cures.
cures = list(pick(pick_n_take(not_used)), pick(pick_n_take(not_used)))
// Get the cure name from the cure_id
@@ -18,7 +18,7 @@
var/mob/dead/observer/selected = pick_n_take(candidates)
var/mob/camera/disease/virus = new /mob/camera/disease(SSmapping.get_station_center())
virus.key = selected.key
selected.transfer_ckey(virus, FALSE)
INVOKE_ASYNC(virus, /mob/camera/disease/proc/pick_name)
message_admins("[ADMIN_LOOKUPFLW(virus)] has been made into a sentient disease by an event.")
log_game("[key_name(virus)] was spawned as a sentient disease by an event.")
@@ -18,7 +18,7 @@ the new instance inside the host to be updated to the template's stats.
layer = BELOW_MOB_LAYER
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
sight = SEE_SELF|SEE_THRU
initial_language_holder = /datum/language_holder/empty
initial_language_holder = /datum/language_holder/universal
var/freemove = TRUE
var/freemove_end = 0
@@ -43,7 +43,7 @@ the new instance inside the host to be updated to the template's stats.
var/move_delay = 1
var/next_adaptation_time = 0
var/adaptation_cooldown = 1200
var/adaptation_cooldown = 600
var/list/purchased_abilities
var/list/unpurchased_abilities
@@ -118,10 +118,28 @@ the new instance inside the host to be updated to the template's stats.
follow_next(Dir & NORTHWEST)
last_move_tick = world.time
/mob/camera/disease/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
. = ..()
var/atom/movable/to_follow = speaker
if(radio_freq)
var/atom/movable/virtualspeaker/V = speaker
to_follow = V.source
var/link
if(to_follow in hosts)
link = FOLLOW_LINK(src, to_follow)
else
link = ""
// Recompose the message, because it's scrambled by default
message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode)
to_chat(src, "[link] [message]")
/mob/camera/disease/mind_initialize()
. = ..()
if(!mind.has_antag_datum(/datum/antagonist/disease))
mind.add_antag_datum(/datum/antagonist/disease)
var/datum/atom_hud/medsensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
medsensor.add_hud_to(src)
/mob/camera/disease/proc/pick_name()
var/static/list/taken_names
@@ -247,9 +265,12 @@ the new instance inside the host to be updated to the template's stats.
if(!move_listener)
move_listener = L.AddComponent(/datum/component/redirect, list(COMSIG_MOVABLE_MOVED = CALLBACK(src, .proc/follow_mob)))
else
L.TakeComponent(move_listener)
if(QDELING(move_listener))
move_listener = null
if(L)
L.TakeComponent(move_listener)
if(QDELING(move_listener))
move_listener = null
else
QDEL_NULL(move_listener)
follow_mob()
/mob/camera/disease/proc/follow_next(reverse = FALSE)
@@ -1,7 +1,8 @@
#define CHALLENGE_TELECRYSTALS 280
#define PLAYER_SCALING 1.5
#define CHALLENGE_TIME_LIMIT 3000
#define CHALLENGE_MIN_PLAYERS 50
#define CHALLENGE_PLAYERS_TARGET 50 //target players population. anything below is a malus to the challenge tc bonus.
#define TELECRYSTALS_MALUS_SCALING 1 //the higher the value, the bigger the malus.
#define CHALLENGE_SHUTTLE_DELAY 15000 // 25 minutes, so the ops have at least 5 minutes before the shuttle is callable.
GLOBAL_LIST_EMPTY(jam_on_wardec)
@@ -62,12 +63,15 @@ GLOBAL_VAR_INIT(war_declared, FALSE)
for(var/obj/machinery/computer/camera_advanced/shuttle_docker/D in GLOB.jam_on_wardec)
D.jammed = TRUE
GLOB.war_declared = TRUE
var/list/nukeops = get_antag_minds(/datum/antagonist/nukeop)
var/actual_players = GLOB.joined_player_list.len - nukeops.len
var/tc_malus = 0
if(actual_players < CHALLENGE_PLAYERS_TARGET)
tc_malus = FLOOR(((CHALLENGE_TELECRYSTALS / CHALLENGE_PLAYERS_TARGET) * (CHALLENGE_PLAYERS_TARGET - actual_players)) * TELECRYSTALS_MALUS_SCALING, 1)
new uplink_type(get_turf(user), user.key, CHALLENGE_TELECRYSTALS + CEILING(PLAYER_SCALING * actual_players, 1))
new uplink_type(get_turf(user), user.key, CHALLENGE_TELECRYSTALS - tc_malus + CEILING(PLAYER_SCALING * actual_players, 1))
CONFIG_SET(number/shuttle_refuel_delay, max(CONFIG_GET(number/shuttle_refuel_delay), CHALLENGE_SHUTTLE_DELAY))
SSblackbox.record_feedback("amount", "nuclear_challenge_mode", 1)
@@ -79,11 +83,6 @@ GLOBAL_VAR_INIT(war_declared, FALSE)
to_chat(user, "You are already in the process of declaring war! Make your mind up.")
return FALSE
var/list/nukeops = get_antag_minds(/datum/antagonist/nukeop)
var/actual_players = GLOB.joined_player_list.len - nukeops.len
if(actual_players < CHALLENGE_MIN_PLAYERS)
to_chat(user, "The enemy crew is too small to be worth declaring war on.")
return FALSE
if(!user.onSyndieBase())
to_chat(user, "You have to be at your base to use this.")
return FALSE
@@ -102,5 +101,6 @@ GLOBAL_VAR_INIT(war_declared, FALSE)
#undef CHALLENGE_TELECRYSTALS
#undef CHALLENGE_TIME_LIMIT
#undef CHALLENGE_MIN_PLAYERS
#undef CHALLENGE_PLAYERS_TARGET
#undef TELECRYSTALS_MALUS_SCALING
#undef CHALLENGE_SHUTTLE_DELAY
@@ -107,9 +107,9 @@
/datum/antagonist/overthrow/proc/equip_overthrow()
if(!owner || !owner.current || !ishuman(owner.current)) // only equip existing human overthrow members. This excludes the AI, in particular.
return
var/obj/item/implant/storage/S = locate(/obj/item/implant/storage) in owner.current
var/obj/item/implant/storage/S = locate(/obj/item/implant/storage) in owner.current.implants
if(!S)
S = new(owner.current)
S = new
S.implant(owner.current)
var/I = pick(possible_useful_items)
if(ispath(I)) // in case some admin decides to fuck the list up for fun
@@ -377,14 +377,15 @@
/obj/item/ectoplasm/revenant/proc/reform()
if(QDELETED(src) || QDELETED(revenant) || inert)
return
var/key_of_revenant
var/key_of_revenant = FALSE
message_admins("Revenant ectoplasm was left undestroyed for 1 minute and is reforming into a new revenant.")
forceMove(drop_location()) //In case it's in a backpack or someone's hand
revenant.forceMove(loc)
if(old_key)
for(var/mob/M in GLOB.dead_mob_list)
if(M.client && M.client.key == old_key) //Only recreates the mob if the mob the client is in is dead
key_of_revenant = old_key
M.transfer_ckey(revenant.key, FALSE)
key_of_revenant = TRUE
break
if(!key_of_revenant)
message_admins("The new revenant's old client either could not be found or is in a new, living mob - grabbing a random candidate instead...")
@@ -396,22 +397,21 @@
visible_message("<span class='revenwarning'>[src] settles down and seems lifeless.</span>")
return
var/mob/dead/observer/C = pick(candidates)
key_of_revenant = C.key
if(!key_of_revenant)
C.transfer_ckey(revenant.key, FALSE)
if(!revenant.key)
qdel(revenant)
message_admins("No ckey was found for the new revenant. Oh well!")
inert = TRUE
visible_message("<span class='revenwarning'>[src] settles down and seems lifeless.</span>")
return
message_admins("[key_of_revenant] has been [old_key == key_of_revenant ? "re":""]made into a revenant by reforming ectoplasm.")
log_game("[key_of_revenant] was [old_key == key_of_revenant ? "re":""]made as a revenant by reforming ectoplasm.")
message_admins("[key_of_revenant] has been [old_key == revenant.key ? "re":""]made into a revenant by reforming ectoplasm.")
log_game("[key_of_revenant] was [old_key == revenant.key ? "re":""]made as a revenant by reforming ectoplasm.")
visible_message("<span class='revenboldnotice'>[src] suddenly rises into the air before fading away.</span>")
revenant.essence = essence
revenant.essence_regen_cap = essence
revenant.death_reset()
revenant.key = key_of_revenant
revenant = null
qdel(src)
@@ -52,7 +52,7 @@
return MAP_ERROR
var/mob/living/simple_animal/revenant/revvie = new(pick(spawn_locs))
revvie.key = selected.key
selected.transfer_ckey(revvie, FALSE)
message_admins("[ADMIN_LOOKUPFLW(revvie)] has been made into a revenant by an event.")
log_game("[key_name(revvie)] was spawned as a revenant by an event.")
spawned_mobs += revvie
@@ -80,6 +80,7 @@
desc = "Still it beats furiously, emanating an aura of utter hate."
icon = 'icons/obj/surgery.dmi'
icon_state = "demon_heart-on"
decay_factor = 0
/obj/item/organ/heart/demon/update_icon()
return //always beating visually
@@ -198,7 +198,7 @@
to_chat(user, "<span class='warning'>This artifact can only affect three undead at a time!</span>")
return
M.set_species(/datum/species/skeleton, icon_update=0)
M.set_species(/datum/species/skeleton/space, icon_update=0)
M.revive(full_heal = 1, admin_revive = 1)
spooky_scaries |= M
to_chat(M, "<span class='userdanger'>You have been revived by </span><B>[user.real_name]!</B>")
@@ -218,7 +218,7 @@
newstruct.master = stoner
var/datum/action/innate/seek_master/SM = new()
SM.Grant(newstruct)
newstruct.key = target.key
target.transfer_ckey(newstruct)
var/obj/screen/alert/bloodsense/BS
if(newstruct.mind && ((stoner && iscultist(stoner)) || cultoverride) && SSticker && SSticker.mode)
SSticker.mode.add_cultist(newstruct.mind, 0)
@@ -243,7 +243,7 @@
S.canmove = FALSE//Can't move out of the soul stone
S.name = "Shade of [T.real_name]"
S.real_name = "Shade of [T.real_name]"
S.key = T.key
T.transfer_ckey(S)
S.language_holder = U.language_holder.copy(S)
if(U)
S.faction |= "[REF(U)]" //Add the master as a faction, allowing inter-mob cooperation
+1 -1
View File
@@ -245,7 +245,7 @@
if(!istype(M))
return
var/obj/item/implant/exile/Implant = new/obj/item/implant/exile(M)
var/obj/item/implant/exile/Implant = new
Implant.implant(M)
/datum/antagonist/wizard/academy/create_objectives()
@@ -394,6 +394,21 @@
. = TRUE
update_icon()
/obj/machinery/atmospherics/components/unary/cryo_cell/CtrlClick(mob/user)
if(user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK) && !state_open)
on = !on
update_icon()
return ..()
/obj/machinery/atmospherics/components/unary/cryo_cell/AltClick(mob/user)
if(user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
if(state_open)
close_machine()
else
open_machine()
update_icon()
return ..()
/obj/machinery/atmospherics/components/unary/cryo_cell/update_remote_sight(mob/living/user)
return // we don't see the pipe network while inside cryo.
@@ -133,7 +133,7 @@
var/mob/dead/observer/C = pick(candidates)
message_admins("[ADMIN_LOOKUPFLW(C)] was spawned as Wizard Academy Defender")
current_wizard.ghostize() // on the off chance braindead defender gets back in
current_wizard.key = C.key
C.transfer_ckey(current_wizard, FALSE)
/obj/structure/academy_wizard_spawner/proc/summon_wizard()
var/turf/T = src.loc
@@ -210,8 +210,6 @@
if(4)
//Destroy Equipment
for (var/obj/item/I in user)
if (istype(I, /obj/item/implant))
continue
qdel(I)
if(5)
//Monkeying
@@ -274,7 +272,7 @@
if(LAZYLEN(candidates))
var/mob/dead/observer/C = pick(candidates)
message_admins("[ADMIN_LOOKUPFLW(C)] was spawned as Dice Servant")
H.key = C.key
C.transfer_ckey(H, FALSE)
var/obj/effect/proc_holder/spell/targeted/summonmob/S = new
S.target_mob = H
+1 -2
View File
@@ -109,10 +109,9 @@ datum/bounty/reagent/complex_drink/New()
/datum/reagent/consumable/ethanol/patron,\
/datum/reagent/consumable/ethanol/quadruple_sec,\
/datum/reagent/consumable/ethanol/quintuple_sec,\
/datum/reagent/consumable/bluecherryshake,\
/datum/reagent/consumable/doctor_delight,\
/datum/reagent/consumable/ethanol/silencer)
var/reagent_type = pick(possible_reagents)
wanted_reagent = new reagent_type
name = wanted_reagent.name
+29 -6
View File
@@ -1762,15 +1762,31 @@
/obj/item/stack/tile/carpet/black/fifty)
crate_name = "premium carpet crate"
/datum/supply_pack/service/carpet2
name = "Premium Carpet Crate #2"
desc = "Plasteel floor tiles getting on your nerves? These stacks of extra soft carpet will tie any room together. Contains red, and monochrome"
cost = 1000
contains = list(/obj/item/stack/tile/carpet/blackred/fifty,
/datum/supply_pack/service/carpet_exotic
name = "Exotic Carpet Crate"
desc = "Exotic carpets straight from Space Russia, for all your decorating needs. Contains 100 tiles each of 10 different flooring patterns."
cost = 4000
contains = list(/obj/item/stack/tile/carpet/blue/fifty,
/obj/item/stack/tile/carpet/blue/fifty,
/obj/item/stack/tile/carpet/cyan/fifty,
/obj/item/stack/tile/carpet/cyan/fifty,
/obj/item/stack/tile/carpet/green/fifty,
/obj/item/stack/tile/carpet/green/fifty,
/obj/item/stack/tile/carpet/orange/fifty,
/obj/item/stack/tile/carpet/orange/fifty,
/obj/item/stack/tile/carpet/purple/fifty,
/obj/item/stack/tile/carpet/purple/fifty,
/obj/item/stack/tile/carpet/red/fifty,
/obj/item/stack/tile/carpet/red/fifty,
/obj/item/stack/tile/carpet/royalblue/fifty,
/obj/item/stack/tile/carpet/royalblue/fifty,
/obj/item/stack/tile/carpet/royalblack/fifty,
/obj/item/stack/tile/carpet/royalblack/fifty,
/obj/item/stack/tile/carpet/blackred/fifty,
/obj/item/stack/tile/carpet/blackred/fifty,
/obj/item/stack/tile/carpet/monochrome/fifty,
/obj/item/stack/tile/carpet/monochrome/fifty)
crate_name = "premium carpet crate #2"
crate_name = "exotic carpet crate"
/datum/supply_pack/service/lightbulbs
name = "Replacement Lights"
@@ -2230,6 +2246,13 @@
contains = list(/mob/living/simple_animal/hostile/retaliate/goat)
crate_name = "goat crate"
/datum/supply_pack/critter/goose
name = "Goose Crate"
desc = "Angry and violent birds. Evil, evil creatures."
cost = 2500
contains = list(/mob/living/simple_animal/hostile/retaliate/goose)
crate_name = "goose crate"
/datum/supply_pack/critter/monkey
name = "Monkey Cube Crate"
desc = "Stop monkeying around! Contains seven monkey cubes. Just add water!"
+2
View File
@@ -571,6 +571,8 @@ GLOBAL_LIST_EMPTY(asset_datums)
"fontawesome-webfont.woff" = 'tgui/assets/fonts/fontawesome-webfont.woff',
"font-awesome.css" = 'code/modules/goonchat/browserassets/css/font-awesome.css',
"browserOutput.css" = 'code/modules/goonchat/browserassets/css/browserOutput.css',
"browserOutput_dark.css" = 'code/modules/goonchat/browserassets/css/browserOutput_dark.css',
"browserOutput_light.css" = 'code/modules/goonchat/browserassets/css/browserOutput_light.css'
)
/datum/asset/spritesheet/goonchat
+41 -93
View File
@@ -5,7 +5,7 @@ This lets you switch chat themes by using winset and CSS loading, you must relog
Things to note:
If you change ANYTHING in interface/skin.dmf you need to change it here:
Format:
winset(src, "window as appears in skin.dmf after elem", "var to change = currentvalue;var to change = desired value")
winset(src, "window as appears in skin.dmf after elem", "var to change = desired value")
How this works:
I've added a function to browseroutput.js which registers a cookie for darkmode and swaps the chat accordingly. You can find the button to do this under the "cog" icon next to the ping button (top right of chat)
This then swaps the window theme automatically
@@ -14,104 +14,52 @@ Thanks to spacemaniac and mcdonald for help with the JS side of this.
/client/proc/force_white_theme() //There's no way round it. We're essentially changing the skin by hand. It's painful but it works, and is the way Lummox suggested.
//Main windows
winset(src, "infowindow", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
winset(src, "infowindow", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "info", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]")
winset(src, "info", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "browseroutput", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]")
winset(src, "browseroutput", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "outputwindow", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
winset(src, "outputwindow", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "mainwindow", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
winset(src, "split", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]")
winset(src, "infowindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "info", "background-color = [COLOR_WHITEMODE_BACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "browseroutput", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "outputwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "mainwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
winset(src, "split", "background-color = [COLOR_WHITEMODE_BACKGROUND]")
//Buttons
winset(src, "changelog", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]")
winset(src, "changelog", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "rules", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]")
winset(src, "rules", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "wiki", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]")
winset(src, "wiki", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "forum", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]")
winset(src, "forum", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "github", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]")
winset(src, "github", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "report-issue", "background-color = [COLOR_DARKMODE_ISSUE_BUTTON_BG];background-color = [COLOR_WHITEMODE_ISSUE_BUTTON_BG]")
winset(src, "report-issue", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "changelog", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "rules", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "wiki", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "forum", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "github", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "report-issue", "background-color = [COLOR_WHITEMODE_ISSUE_BUTTON_BG];text-color = [COLOR_WHITEMODE_TEXT]")
//Status and verb tabs
winset(src, "output", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]")
winset(src, "output", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "statwindow", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
winset(src, "statwindow", "text-color = #eaeaea;text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "stat", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]")
winset(src, "stat", "tab-background-color = [COLOR_DARKMODE_BACKGROUND];tab-background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
winset(src, "stat", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "stat", "tab-text-color = [COLOR_DARKMODE_TEXT];tab-text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "stat", "prefix-color = [COLOR_DARKMODE_TEXT];prefix-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "stat", "suffix-color = [COLOR_DARKMODE_TEXT];suffix-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "output", "background-color = [COLOR_WHITEMODE_BACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "statwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "stat", "background-color = [COLOR_WHITEMODE_BACKGROUND];tab-background-color = [COLOR_WHITEMODE_DARKBACKGROUND];\
text-color = [COLOR_WHITEMODE_TEXT];tab-text-color = [COLOR_WHITEMODE_TEXT];\
prefix-color = [COLOR_WHITEMODE_TEXT];suffix-color = [COLOR_WHITEMODE_TEXT]")
//Etc.
winset(src, "say", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
winset(src, "say", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "asset_cache_browser", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]")
winset(src, "asset_cache_browser", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "tooltip", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]")
winset(src, "tooltip", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "say", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "asset_cache_browser", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]")
winset(src, "tooltip", "background-color = [COLOR_WHITEMODE_BACKGROUND];text-color = [COLOR_WHITEMODE_TEXT]")
/client/proc/force_dark_theme() //Inversely, if theyre using white theme and want to swap to the superior dark theme, let's get WINSET() ing
//Main windows
winset(src, "infowindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_DARKBACKGROUND]")
winset(src, "infowindow", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "info", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
winset(src, "info", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "browseroutput", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
winset(src, "browseroutput", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "outputwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
winset(src, "outputwindow", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "mainwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_DARKBACKGROUND]")
winset(src, "split", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
winset(src, "infowindow", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "info", "background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "browseroutput", "background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "outputwindow", "background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "mainwindow", "background-color = [COLOR_DARKMODE_DARKBACKGROUND]")
winset(src, "split", "background-color = [COLOR_DARKMODE_BACKGROUND]")
//Buttons
winset(src, "changelog", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]")
winset(src, "changelog", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "rules", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]")
winset(src, "rules", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "wiki", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]")
winset(src, "wiki", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "forum", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]")
winset(src, "forum", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "github", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]")
winset(src, "github", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "report-issue", "background-color = [COLOR_WHITEMODE_ISSUE_BUTTON_BG];background-color = [COLOR_DARKMODE_ISSUE_BUTTON_BG]")
winset(src, "report-issue", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "changelog", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "rules", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "wiki", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "forum", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "github", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "report-issue", "background-color = [COLOR_DARKMODE_ISSUE_BUTTON_BG];text-color = [COLOR_DARKMODE_TEXT]")
//Status and verb tabs
winset(src, "output", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
winset(src, "output", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "statwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_DARKBACKGROUND]")
winset(src, "statwindow", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "stat", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_DARKBACKGROUND]")
winset(src, "stat", "tab-background-color = [COLOR_WHITEMODE_DARKBACKGROUND];tab-background-color = [COLOR_DARKMODE_BACKGROUND]")
winset(src, "stat", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "stat", "tab-text-color = [COLOR_WHITEMODE_TEXT];tab-text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "stat", "prefix-color = [COLOR_WHITEMODE_TEXT];prefix-color = [COLOR_DARKMODE_TEXT]")
winset(src, "stat", "suffix-color = [COLOR_WHITEMODE_TEXT];suffix-color = [COLOR_DARKMODE_TEXT]")
winset(src, "output", "background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "statwindow", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "stat", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];tab-background-color = [COLOR_DARKMODE_BACKGROUND];\
text-color = [COLOR_DARKMODE_TEXT];tab-text-color = [COLOR_DARKMODE_TEXT];\
prefix-color = [COLOR_DARKMODE_TEXT];suffix-color = [COLOR_DARKMODE_TEXT]")
//Etc.
winset(src, "say", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
winset(src, "say", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "asset_cache_browser", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
winset(src, "asset_cache_browser", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "tooltip", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]")
winset(src, "tooltip", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]")
/datum/asset/simple/goonchat
verify = FALSE
assets = list(
"json2.min.js" = 'code/modules/goonchat/browserassets/js/json2.min.js',
"errorHandler.js" = 'code/modules/goonchat/browserassets/js/errorHandler.js',
"browserOutput.js" = 'code/modules/goonchat/browserassets/js/browserOutput.js',
"fontawesome-webfont.eot" = 'tgui/assets/fonts/fontawesome-webfont.eot',
"fontawesome-webfont.svg" = 'tgui/assets/fonts/fontawesome-webfont.svg',
"fontawesome-webfont.ttf" = 'tgui/assets/fonts/fontawesome-webfont.ttf',
"fontawesome-webfont.woff" = 'tgui/assets/fonts/fontawesome-webfont.woff',
"font-awesome.css" = 'code/modules/goonchat/browserassets/css/font-awesome.css',
"browserOutput.css" = 'code/modules/goonchat/browserassets/css/browserOutput.css',
"browserOutput_white.css" = 'code/modules/goonchat/browserassets/css/browserOutput_white.css',
)
winset(src, "say", "background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "asset_cache_browser", "background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "tooltip", "background-color = [COLOR_DARKMODE_BACKGROUND];text-color = [COLOR_DARKMODE_TEXT]")
+6
View File
@@ -1039,6 +1039,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/available_in_days = job.available_in_days(user.client)
HTML += "<font color=red>[rank]</font></td><td><font color=red> \[IN [(available_in_days)] DAYS\]</font></td></tr>"
continue
if(!user.client.prefs.pref_species.qualifies_for_rank(rank, user.client.prefs.features))
if(user.client.prefs.pref_species.id == "human")
HTML += "<font color=red>[rank]</font></td><td><font color=red><b> \[MUTANT\]</b></font></td></tr>"
else
HTML += "<font color=red>[rank]</font></td><td><font color=red><b> \[NON-HUMAN\]</b></font></td></tr>"
continue
if((job_preferences["[SSjob.overflow_role]"] == JP_LOW) && (rank != SSjob.overflow_role) && !jobban_isbanned(user, SSjob.overflow_role))
HTML += "<font color=orange>[rank]</font></td><td></td></tr>"
continue
+11 -21
View File
@@ -1,3 +1,6 @@
GLOBAL_VAR_INIT(LOOC_COLOR, null)//If this is null, use the CSS for OOC. Otherwise, use a custom colour.
GLOBAL_VAR_INIT(normal_looc_colour, "#6699CC")
/client/verb/looc(msg as text)
set name = "LOOC"
set desc = "Local OOC, seen only by those in view."
@@ -59,30 +62,17 @@
continue //Also handled later.
if(C.prefs.toggles & CHAT_OOC)
// var/display_name = src.key
// if(holder)
// if(holder.fakekey)
// if(C.holder)
// display_name = "[holder.fakekey]/([src.key])"
// else
// display_name = holder.fakekey
to_chat(C,"<font color='#6699CC'><span class='ooc'><span class='prefix'>LOOC:</span> <EM>[src.mob.name]:</EM> <span class='message'>[msg]</span></span></font>")
if(GLOB.LOOC_COLOR)
to_chat(C, "<font color='[GLOB.LOOC_COLOR]'><b><span class='prefix'>LOOC:</span> <EM>[src.mob.name]:</EM> <span class='message'>[msg]</span></b></font>")
else
to_chat(C, "<span class='looc'><span class='prefix'>LOOC:</span> <EM>[src.mob.name]:</EM> <span class='message'>[msg]</span></span>")
for(var/client/C in GLOB.admins)
if(C.prefs.toggles & CHAT_OOC)
var/prefix = "(R)LOOC"
if (C.mob in heard)
prefix = "LOOC"
to_chat(C,"<font color='#6699CC'><span class='ooc'>[ADMIN_FLW(usr)]<span class='prefix'>[prefix]:</span> <EM>[src.key]/[src.mob.name]:</EM> <span class='message'>[msg]</span></span></font>")
/*for(var/mob/dead/observer/G in world)
if(!G.client)
continue
var/client/C = G.client
if (C in GLOB.admins)
continue //handled earlier.
if(C.prefs.toggles & CHAT_OOC)
var/prefix = "(G)LOOC"
if (C.mob in heard)
prefix = "LOOC"
to_chat(C,"<font color='#6699CC'><span class='ooc'><span class='prefix'>[prefix]:</span> <EM>[src.key]/[src.mob.name]:</EM> <span class='message'>[msg]</span></span></font>")*/
if(GLOB.LOOC_COLOR)
to_chat(C, "<font color='[GLOB.LOOC_COLOR]'><b>[ADMIN_FLW(usr)] <span class='prefix'>[prefix]:</span> <EM>[src.key]/[src.mob.name]:</EM> <span class='message'>[msg]</span></b></font>")
else
to_chat(C, "<span class='looc'>[ADMIN_FLW(usr)] <span class='prefix'>[prefix]:</span> <EM>[src.key]/[src.mob.name]:</EM> <span class='message'>[msg]</span></span>")
+42
View File
@@ -41,6 +41,13 @@
var/dynamic_hair_suffix = ""//head > mask for head hair
var/dynamic_fhair_suffix = ""//mask > head for facial hair
//basically a restriction list.
var/list/species_restricted = null
//Basically syntax is species_restricted = list("Species Name","Species Name")
//Add a "exclude" string to do the opposite, making it only only species listed that can't wear it.
//You append this to clothing objects.
/obj/item/clothing/Initialize()
. = ..()
if(CHECK_BITFIELD(clothing_flags, VOICEBOX_TOGGLABLE))
@@ -338,3 +345,38 @@ BLIND // can't see anything
deconstruct(FALSE)
else
..()
//Species-restricted clothing check. - Thanks Oraclestation, BS13, /vg/station etc.
/obj/item/clothing/mob_can_equip(mob/M, slot, disable_warning = TRUE)
//if we can't equip the item anyway, don't bother with species_restricted (also cuts down on spam)
if(!..())
return FALSE
// Skip species restriction checks on non-equipment slots
if(slot in list(SLOT_IN_BACKPACK, SLOT_L_STORE, SLOT_R_STORE))
return TRUE
if(species_restricted && ishuman(M))
var/wearable = null
var/exclusive = null
var/mob/living/carbon/human/H = M
if("exclude" in species_restricted) //TURNS IT INTO A BLACKLIST - AKA ALL MINUS SPECIES LISTED.
exclusive = TRUE
if(H.dna.species)
if(exclusive)
if(!(H.dna.species.name in species_restricted))
wearable = TRUE
else
if(H.dna.species.name in species_restricted)
wearable = TRUE
if(!wearable)
to_chat(M, "<span class='warning'>Your species cannot wear [src].</span>")
return FALSE
return TRUE
+27
View File
@@ -281,6 +281,33 @@
..()
user.cure_blind("blindfold_[REF(src)]")
/obj/item/clothing/glasses/sunglasses/blindfold/white
name = "blind personnel blindfold"
desc = "Indicates that the wearer suffers from blindness."
icon_state = "blindfoldwhite"
item_state = "blindfoldwhite"
var/colored_before = FALSE
/obj/item/clothing/glasses/sunglasses/blindfold/white/equipped(mob/living/carbon/human/user, slot)
if(ishuman(user) && slot == SLOT_GLASSES)
update_icon(user)
user.update_inv_glasses() //Color might have been changed by update_icon.
..()
/obj/item/clothing/glasses/sunglasses/blindfold/white/update_icon(mob/living/carbon/human/user)
if(ishuman(user) && !colored_before)
add_atom_colour("#[user.eye_color]", FIXED_COLOUR_PRIORITY)
colored_before = TRUE
/obj/item/clothing/glasses/sunglasses/blindfold/white/worn_overlays(isinhands = FALSE, file2use)
. = list()
if(!isinhands && ishuman(loc) && !colored_before)
var/mob/living/carbon/human/H = loc
var/mutable_appearance/M = mutable_appearance('icons/mob/eyes.dmi', "blindfoldwhite")
M.appearance_flags |= RESET_COLOR
M.color = "#[H.eye_color]"
. += M
/obj/item/clothing/glasses/sunglasses/big
desc = "Strangely ancient technology used to help provide rudimentary eye cover. Larger than average enhanced shielding blocks flashes."
icon_state = "bigsunglasses"
+1 -1
View File
@@ -10,7 +10,7 @@
if(visualsOnly)
return
var/obj/item/implant/mindshield/L = new/obj/item/implant/mindshield(H)
var/obj/item/implant/mindshield/L = new
L.implant(H, null, 1)
var/obj/item/radio/R = H.ears
+164
View File
@@ -0,0 +1,164 @@
/datum/outfit/plasmaman/bar
name = "Bartender Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/white
uniform = /obj/item/clothing/under/plasmaman/enviroslacks
/datum/outfit/plasmaman/chef
name = "Chef Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/white
uniform = /obj/item/clothing/under/plasmaman/chef
/datum/outfit/plasmaman/botany
name = "Botany Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/botany
uniform = /obj/item/clothing/under/plasmaman/botany
/datum/outfit/plasmaman/curator
name = "Curator Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/curator
uniform = /obj/item/clothing/under/plasmaman/curator
/datum/outfit/plasmaman/chaplain
name = "Chaplain Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/chaplain
uniform = /obj/item/clothing/under/plasmaman/chaplain
/datum/outfit/plasmaman/janitor
name = "Janitor Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/janitor
uniform = /obj/item/clothing/under/plasmaman/janitor
/datum/outfit/plasmaman/hop
name = "Head of Personell Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/hop
uniform = /obj/item/clothing/under/plasmaman/hop
/datum/outfit/plasmaman/captain
name = "Captain Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/captain
uniform = /obj/item/clothing/under/plasmaman/captain
/datum/outfit/plasmaman/security
name = "Security Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/security
uniform = /obj/item/clothing/under/plasmaman/security
ears = /obj/item/radio/headset/headset_sec
/datum/outfit/plasmaman/detective
name = "Detective Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/white
uniform = /obj/item/clothing/under/plasmaman/enviroslacks
/datum/outfit/plasmaman/warden
name = "Warden Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/security/warden
uniform = /obj/item/clothing/under/plasmaman/security/warden
/datum/outfit/plasmaman/hos
name = "Head of Security Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/security/hos
uniform = /obj/item/clothing/under/plasmaman/security/hos
/datum/outfit/plasmaman/cargo
name = "Cargo Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/cargo
uniform = /obj/item/clothing/under/plasmaman/cargo
/datum/outfit/plasmaman/mining
name = "Mining Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/mining
uniform = /obj/item/clothing/under/plasmaman/mining
/datum/outfit/plasmaman/medical
name = "Medical Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/medical
uniform = /obj/item/clothing/under/plasmaman/medical
/datum/outfit/plasmaman/cmo
name = "Chief Medical Officer Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/cmo
uniform = /obj/item/clothing/under/plasmaman/cmo
/datum/outfit/plasmaman/viro
name = "Virology Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/viro
uniform = /obj/item/clothing/under/plasmaman/viro
/datum/outfit/plasmaman/chemist
name = "Chemist Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/chemist
uniform = /obj/item/clothing/under/plasmaman/chemist
/datum/outfit/plasmaman/genetics
name = "Genetics Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/genetics
uniform = /obj/item/clothing/under/plasmaman/genetics
/datum/outfit/plasmaman/science
name = "Science Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/science
uniform = /obj/item/clothing/under/plasmaman/science
/datum/outfit/plasmaman/rd
name = "Research Director Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/rd
uniform = /obj/item/clothing/under/plasmaman/rd
/datum/outfit/plasmaman/robotics
name = "Robotics Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/robotics
uniform = /obj/item/clothing/under/plasmaman/robotics
/datum/outfit/plasmaman/engineering
name = "Engineering Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/engineering
uniform = /obj/item/clothing/under/plasmaman/engineering
/datum/outfit/plasmaman/ce
name = "Chief Engineer Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/engineering/ce
uniform = /obj/item/clothing/under/plasmaman/engineering/ce
/datum/outfit/plasmaman/atmospherics
name = "Atmospherics Plasmaman"
head = /obj/item/clothing/head/helmet/space/plasmaman/atmospherics
uniform = /obj/item/clothing/under/plasmaman/atmospherics
/datum/outfit/plasmaman/mime
name = "Plasmamime"
head = /obj/item/clothing/head/helmet/space/plasmaman/mime
uniform = /obj/item/clothing/under/plasmaman/mime
mask = /obj/item/clothing/mask/gas/mime
/datum/outfit/plasmaman/clown
name = "Plasmaclown"
head = /obj/item/clothing/head/helmet/space/plasmaman/clown
uniform = /obj/item/clothing/under/plasmaman/clown
mask = /obj/item/clothing/mask/gas/clown_hat
+2 -2
View File
@@ -399,7 +399,7 @@
R.set_frequency(FREQ_CENTCOM)
R.freqlock = TRUE
var/obj/item/implant/mindshield/L = new/obj/item/implant/mindshield(H)//Here you go Deuryn
var/obj/item/implant/mindshield/L = new //Here you go Deuryn
L.implant(H, null, 1)
@@ -426,7 +426,7 @@
/datum/outfit/debug //Debug objs plus hardsuit
name = "Debug outfit"
uniform = /obj/item/clothing/under/patriotsuit
uniform = /obj/item/clothing/under/patriotsuit
suit = /obj/item/clothing/suit/space/hardsuit/syndi/elite
shoes = /obj/item/clothing/shoes/magboots/advance
suit_store = /obj/item/tank/internals/oxygen
+2 -2
View File
@@ -29,9 +29,9 @@
. = ..()
var/obj/item/uplink/U = new /obj/item/uplink/nuclear_restricted(H, H.key, 80)
H.equip_to_slot_or_del(U, SLOT_IN_BACKPACK)
var/obj/item/implant/weapons_auth/W = new/obj/item/implant/weapons_auth(H)
var/obj/item/implant/weapons_auth/W = new
W.implant(H)
var/obj/item/implant/explosive/E = new/obj/item/implant/explosive(H)
var/obj/item/implant/explosive/E = new
E.implant(H)
H.faction |= ROLE_SYNDICATE
H.update_icons()
@@ -22,6 +22,7 @@
resistance_flags = NONE
dog_fashion = null
mutantrace_variation = MUTANTRACE_VARIATION
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
/obj/item/clothing/suit/space
name = "space suit"
@@ -44,4 +45,5 @@
strip_delay = 80
equip_delay_other = 80
resistance_flags = NONE
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE //rated for cosmic radation :honk:
tauric = TRUE //Citadel Add for tauric hardsuits
+172 -3
View File
@@ -12,7 +12,7 @@
var/next_extinguish = 0
var/extinguish_cooldown = 100
var/extinguishes_left = 10
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/suit/space/eva/plasmaman/examine(mob/user)
..()
@@ -45,12 +45,18 @@
resistance_flags = FIRE_PROOF
var/brightness_on = 4 //luminosity when the light is on
var/on = FALSE
var/light_overlay = "envirohelm-light"
actions_types = list(/datum/action/item_action/toggle_helmet_light)
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/head/helmet/space/plasmaman/attack_self(mob/user)
if(!light_overlay)
return
on = !on
icon_state = "[initial(icon_state)][on ? "-light":""]"
item_state = icon_state
if(!on)
cut_overlay(light_overlay)
else
add_overlay(light_overlay)
user.update_inv_head() //So the mob overlay updates
if(on)
@@ -61,3 +67,166 @@
for(var/X in actions)
var/datum/action/A=X
A.UpdateButtonIcon()
/obj/item/clothing/head/helmet/space/plasmaman/worn_overlays(isinhands, icon_file)
. = ..()
if(!isinhands && on)
. += mutable_appearance(icon_file, light_overlay)
/obj/item/clothing/head/helmet/space/plasmaman/security
name = "security plasma envirosuit helmet"
desc = "A plasmaman containment helmet designed for security officers, protecting them from being flashed and burning alive, along-side other undesirables."
icon_state = "security_envirohelm"
item_state = "security_envirohelm"
armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 100, "acid" = 75)
/obj/item/clothing/head/helmet/space/plasmaman/security/warden
name = "warden's plasma envirosuit helmet"
desc = "A plasmaman containment helmet designed for the warden, a pair of white stripes being added to differeciate them from other members of security."
icon_state = "warden_envirohelm"
item_state = "warden_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/security/hos
name = "head of security's plasma envirosuit helmet"
desc = "A plasmaman containment helmet designed for the head of security, manacing black with red stripes, to differenciate them from other members of security."
icon_state = "hos_envirohelm"
item_state = "hos_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/medical
name = "medical's plasma envirosuit helmet"
desc = "An envriohelmet designed for plasmaman medical doctors, having two stripes down it's length to denote as much."
icon_state = "doctor_envirohelm"
item_state = "doctor_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/cmo
name = "chief medical officer's plasma envirosuit helmet"
desc = "A blue and white envriohelmet designed for the chief medical officer."
icon_state = "cmo_envirohelm"
item_state = "cmo_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/genetics
name = "geneticist's plasma envirosuit helmet"
desc = "A plasmaman envirohelmet designed for geneticists."
icon_state = "geneticist_envirohelm"
item_state = "geneticist_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/viro
name = "virology plasma envirosuit helmet"
desc = "The helmet worn by the safest people on the station, those who are completely immune to the monstrosities they create."
icon_state = "virologist_envirohelm"
item_state = "virologist_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/chemist
name = "chemistry plasma envirosuit helmet"
desc = "A plasmaman envirosuit designed for chemists, two orange stripes going down it's face."
icon_state = "chemist_envirohelm"
item_state = "chemist_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/science
name = "science plasma envirosuit helmet"
desc = "A plasmaman envirohelmet designed for scientists."
icon_state = "scientist_envirohelm"
item_state = "scientist_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/rd
name = "research director's plasma envirosuit helmet"
desc = "A sturdier plasmaman envirohelmet designed for research directors."
icon_state = "rd_envirohelm"
item_state = "rd_envirohelm"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 100, "rad" = 0, "fire" = 100, "acid" = 75)
/obj/item/clothing/head/helmet/space/plasmaman/robotics
name = "robotics plasma envirosuit helmet"
desc = "A plasmaman envirohelmet designed for roboticists."
icon_state = "roboticist_envirohelm"
item_state = "roboticist_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/engineering
name = "engineering plasma envirosuit helmet"
desc = "A space-worthy helmet specially designed for engineer plasmamen, the usual purple stripes being replaced by engineering's orange."
icon_state = "engineer_envirohelm"
item_state = "engineer_envirohelm"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 10, "fire" = 100, "acid" = 75)
/obj/item/clothing/head/helmet/space/plasmaman/engineering/ce
name = "chief engineer's plasma envirosuit helmet"
desc = "A space-worthy helmet specially designed for the chief engineer, white with gold stripes designed for high visibility."
icon_state = "ce_envirohelm"
item_state = "ce_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/atmospherics
name = "atmospherics plasma envirosuit helmet"
desc = "A space-worthy helmet specially designed for atmos technician plasmamen, the usual purple stripes being replaced by engineering's blue."
icon_state = "atmos_envirohelm"
item_state = "atmos_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/cargo
name = "cargo plasma envirosuit helmet"
desc = "An plasmaman envirohelmet designed for cargo techs and quartermasters."
icon_state = "cargo_envirohelm"
item_state = "cargo_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/mining
name = "mining plasma envirosuit helmet"
desc = "A khaki helmet given to plasmamen miners operating on lavaland."
icon_state = "explorer_envirohelm"
item_state = "explorer_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/chaplain
name = "chaplain's plasma envirosuit helmet"
desc = "An envirohelmet specially designed for only the most pious of plasmamen."
icon_state = "chap_envirohelm"
item_state = "chap_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/white
name = "white plasma envirosuit helmet"
desc = "A generic white envirohelm."
icon_state = "white_envirohelm"
item_state = "white_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/hop
name = "head of personell's plasma envirosuit helmet"
desc = "A finely tailored azure envirohelm designed for head of personell."
icon_state = "hop_envirohelm"
item_state = "hop_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/captain
name = "captain's plasma envirosuit helmet"
desc = "A blue and gold envirohelm designed for the station's captain, nonetheless. Made of superior materials to protect them from the station hazards and more."
icon_state = "captain_envirohelm"
item_state = "captain_envirohelm"
armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 10, "bio" = 100, "rad" = 10, "fire" = 100, "acid" = 85)
/obj/item/clothing/head/helmet/space/plasmaman/curator
name = "curator's plasma envirosuit helmet"
desc = "A slight modification on a tradiational voidsuit helmet, this helmet was Nano-Trasen's first solution to the *logistical problems* that come with employing plasmamen. Despite their limitations, these helmets still see use by historian and old-styled plasmamen alike."
icon_state = "prototype_envirohelm"
item_state = "prototype_envirohelm"
light_overlay = null
actions_types = list()
/obj/item/clothing/head/helmet/space/plasmaman/botany
name = "botany plasma envirosuit helmet"
desc = "A green and blue envirohelmet designating it's wearer as a botanist. While not specially designed for it, it would protect against minor planet-related injuries."
icon_state = "botany_envirohelm"
item_state = "botany_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/janitor
name = "janitor's plasma envirosuit helmet"
desc = "A grey helmet bearing a pair of purple stripes, designating the wearer as a janitor."
icon_state = "janitor_envirohelm"
item_state = "janitor_envirohelm"
/obj/item/clothing/head/helmet/space/plasmaman/mime
name = "mime envirosuit helmet"
desc = "The make-up is painted on, it's a miracle it doesn't chip. It's not very colourful."
icon_state = "mime_envirohelm"
item_state = "mime_envirohelm"
light_overlay = "mime_envirohelm-light"
/obj/item/clothing/head/helmet/space/plasmaman/clown
name = "clown envirosuit helmet"
desc = "The make-up is painted on, it's a miracle it doesn't chip. <i>'HONK!'</i>"
icon_state = "clown_envirohelm"
item_state = "clown_envirohelm"
light_overlay = "clown_envirohelm-light"
+2 -2
View File
@@ -130,7 +130,7 @@
equip_delay_other = 60
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
resistance_flags = NONE
rad_flags = RAD_PROTECT_CONTENTS
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/suit/radiation
@@ -150,5 +150,5 @@
equip_delay_other = 60
flags_inv = HIDEJUMPSUIT|HIDETAUR
resistance_flags = NONE
rad_flags = RAD_PROTECT_CONTENTS
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
tauric = TRUE //Citadel Add for tauric hardsuits
@@ -0,0 +1,100 @@
/obj/item/clothing/under/plasmaman/cargo
name = "cargo plasma envirosuit"
desc = "A joint envirosuit used by plasmamen quartermasters and cargo techs alike, due to the logistical problems of differenciating the two with the length of their pant legs."
icon_state = "cargo_envirosuit"
item_state = "cargo_envirosuit"
item_color = "cargo_envirosuit"
/obj/item/clothing/under/plasmaman/mining
name = "mining plasma envirosuit"
desc = "An air-tight khaki suit designed for operations on lavaland by plasmamen."
icon_state = "explorer_envirosuit"
item_state = "explorer_envirosuit"
item_color = "explorer_envirosuit"
/obj/item/clothing/under/plasmaman/chef
name = "chef's plasma envirosuit"
desc = "A white plasmaman envirosuit designed for cullinary practices. One might question why a member of a species that doesn't need to eat would become a chef."
icon_state = "chef_envirosuit"
item_state = "chef_envirosuit"
item_color = "chef_envirosuit"
/obj/item/clothing/under/plasmaman/enviroslacks
name = "enviroslacks"
desc = "The pet project of a particularly posh plasmaman, this custom suit was quickly appropriated by Nano-Trasen for it's detectives, lawyers, and bar-tenders alike."
icon_state = "enviroslacks"
item_state = "enviroslacks"
item_color = "enviroslacks"
/obj/item/clothing/under/plasmaman/chaplain
name = "chaplain's plasma envirosuit"
desc = "An envirosuit specially designed for only the most pious of plasmamen."
icon_state = "chap_envirosuit"
item_state = "chap_envirosuit"
item_color = "chap_envirosuit"
/obj/item/clothing/under/plasmaman/curator
name = "curator's plasma envirosuit"
desc = "Made out of a modified voidsuit, this suit was Nano-Trasen's first solution to the *logistical problems* that come with employing plasmamen. Due to the modifications, the suit is no longer space-worthy. Despite their limitations, these suits are still in used by historian and old-styled plasmamen alike."
icon_state = "prototype_envirosuit"
item_state = "prototype_envirosuit"
item_color = "prototype_envirosuit"
/obj/item/clothing/under/plasmaman/janitor
name = "janitor's plasma envirosuit"
desc = "A grey and purple envirosuit designated for plasmamen janitors."
icon_state = "janitor_envirosuit"
item_state = "janitor_envirosuit"
item_color = "janitor_envirosuit"
/obj/item/clothing/under/plasmaman/botany
name = "botany envirosuit"
desc = "A green and blue envirosuit designed to protect plasmamen from minor plant-related injuries."
icon_state = "botany_envirosuit"
item_state = "botany_envirosuit"
item_color = "botany_envirosuit"
/obj/item/clothing/under/plasmaman/hop
name = "head of personell's envirosuit"
desc = "A prestigious azure envirosuit designed for head of personell."
icon_state = "hop_envirosuit"
item_state = "hop_envirosuit"
item_color = "hop_envirosuit"
/obj/item/clothing/under/plasmaman/captain
name = "captain's envirosuit"
desc = "An expensive piece of plasmaman envirosuit fashion. guaranteed to keep you cool while the station goes down in fierceful fires."
icon_state = "captain_envirosuit"
item_state = "captain_envirosuit"
item_color = "captain_envirosuit"
armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95)
/obj/item/clothing/under/plasmaman/mime
name = "mime envirosuit"
desc = "It's not very colourful."
icon_state = "mime_envirosuit"
item_state = "mime_envirosuit"
item_color = "mime_envirosuit"
/obj/item/clothing/under/plasmaman/clown
name = "clown envirosuit"
desc = "<i>'HONK!'</i>"
icon_state = "clown_envirosuit"
item_state = "clown_envirosuit"
item_color = "clown_envirosuit"
/obj/item/clothing/under/plasmaman/clown/Extinguish(mob/living/carbon/human/H)
if(!istype(H))
return
if(H.on_fire)
if(extinguishes_left)
if(next_extinguish > world.time)
return
next_extinguish = world.time + extinguish_cooldown
extinguishes_left--
H.visible_message("<span class='warning'>[H]'s suit spews out a tonne of space lube!</span>","<span class='warning'>Your suit spews out a tonne of space lube!</span>")
H.ExtinguishMob()
new /obj/effect/particle_effect/foam(loc) //Truely terrifying.
return FALSE
@@ -0,0 +1,21 @@
/obj/item/clothing/under/plasmaman/engineering
name = "engineering plasma envirosuit"
desc = "An air-tight suit designed to be used by plasmamen exployed as engineers, the usual purple stripes being replaced by engineer's orange. It protects the user from fire and acid damage."
icon_state = "engineer_envirosuit"
item_state = "engineer_envirosuit"
item_color = "engineer_envirosuit"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 10, "fire" = 95, "acid" = 95)
/obj/item/clothing/under/plasmaman/engineering/ce
name = "chief engineer's plasma envirosuit"
desc = "An advanced air-tight suit designed to be used by plasmamen chief engineers, complete with ornamental widgets and gizmo. It protects the user from fire and acid damage."
icon_state = "ce_envirosuit"
item_state = "ce_envirosuit"
item_color = "ce_envirosuit"
/obj/item/clothing/under/plasmaman/atmospherics
name = "atmospherics plasma envirosuit"
desc = "An air-tight suit designed to be used by plasmamen exployed as atmos technicians, the usual purple stripes being replaced by atmos's blue."
icon_state = "atmos_envirosuit"
item_state = "atmos_envirosuit"
item_color = "atmos_envirosuit"
@@ -0,0 +1,56 @@
/obj/item/clothing/under/plasmaman/medical
name = "medical plasma envirosuit"
desc = "A suit designed for the station's more plasma-based doctors."
icon_state = "doctor_envirosuit"
item_state = "doctor_envirosuit"
item_color = "doctor_envirosuit"
/obj/item/clothing/under/plasmaman/cmo
name = "chief medical officer's plasma envirosuit"
desc = "A suit designed for the station's most plasma-based chief medical officer, but not for their cat."
icon_state = "cmo_envirosuit"
item_state = "cmo_envirosuit"
item_color = "cmo_envirosuit"
/obj/item/clothing/under/plasmaman/science
name = "science plasma envirosuit"
desc = "A plasmaman envirosuit designed for scientists."
icon_state = "scientist_envirosuit"
item_state = "scientist_envirosuit"
item_color = "scientist_envirosuit"
/obj/item/clothing/under/plasmaman/rd
name = "research direactor's plasma envirosuit"
desc = "A plasmaman envirosuit designed for the research director to aid them in their job of directing research into the right direction."
icon_state = "rd_envirosuit"
item_state = "rd_envirosuit"
item_color = "rd_envirosuit"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95)
/obj/item/clothing/under/plasmaman/robotics
name = "robotics plasma envirosuit"
desc = "A plasmaman envirosuit designed for roboticists."
icon_state = "roboticist_envirosuit"
item_state = "roboticist_envirosuit"
item_color = "roboticist_envirosuit"
/obj/item/clothing/under/plasmaman/viro
name = "virology plasma envirosuit"
desc = "The suit worn by the safest people on the station, those who are completely immune to the monstrosities they create."
icon_state = "virologist_envirosuit"
item_state = "virologist_envirosuit"
item_color = "virologist_envirosuit"
/obj/item/clothing/under/plasmaman/genetics
name = "genetics plasma envirosuit"
desc = "A plasmaman envirosuit designed for geneticists."
icon_state = "geneticist_envirosuit"
item_state = "geneticist_envirosuit"
item_color = "geneticist_envirosuit"
/obj/item/clothing/under/plasmaman/chemist
name = "chemistry plasma envirosuit"
desc = "A plasmaman envirosuit designed for chemists."
icon_state = "chemist_envirosuit"
item_state = "chemist_envirosuit"
item_color = "chemist_envirosuit"
@@ -0,0 +1,21 @@
/obj/item/clothing/under/plasmaman/security
name = "security plasma envirosuit"
desc = "A plasmaman containment suit designed for security officers, offering a limited amount of extra protection."
icon_state = "security_envirosuit"
item_state = "security_envirosuit"
item_color = "security_envirosuit"
armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95)
/obj/item/clothing/under/plasmaman/security/warden
name = "warden plasma envirosuit"
desc = "A plasmaman containment suit designed for the warden, white stripes being added to differeciate them from other members of security."
icon_state = "warden_envirosuit"
item_state = "warden_envirosuit"
item_color = "warden_envirosuit"
/obj/item/clothing/under/plasmaman/security/hos
name = "security plasma envirosuit"
desc = "A slick black and red plasmaman containment suit designed for the head of security, also called the LAW."
icon_state = "hos_envirosuit"
item_state = "hos_envirosuit"
item_color = "hos_envirosuit"
@@ -589,6 +589,7 @@
item_state = "b_suit"
item_color = "sailor"
can_adjust = FALSE
/obj/item/clothing/under/plasmaman
name = "plasma envirosuit"
desc = "A special containment suit that allows plasma-based lifeforms to exist safely in an oxygenated environment, and automatically extinguishes them in a crisis. Despite being airtight, it's not spaceworthy."
@@ -596,12 +597,15 @@
item_state = "plasmaman"
item_color = "plasmaman"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95)
slowdown = 1
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
mutantrace_variation = NO_MUTANTRACE_VARIATION
can_adjust = FALSE
strip_delay = 80
var/next_extinguish = 0
var/extinguish_cooldown = 100
var/extinguishes_left = 5
/obj/item/clothing/under/plasmaman/examine(mob/user)
..()
to_chat(user, "<span class='notice'>There are [extinguishes_left] extinguisher charges left in this suit.</span>")
@@ -618,6 +622,7 @@
H.ExtinguishMob()
new /obj/effect/particle_effect/water(get_turf(H))
return 0
/obj/item/clothing/under/plasmaman/attackby(obj/item/E, mob/user, params)
..()
if (istype(E, /obj/item/extinguisher_refill))
@@ -631,11 +636,13 @@
return
return
return
/obj/item/extinguisher_refill
name = "envirosuit extinguisher cartridge"
desc = "A cartridge loaded with a compressed extinguisher mix, used to refill the automatic extinguisher on plasma envirosuits."
icon_state = "plasmarefill"
icon = 'icons/obj/device.dmi'
/obj/item/clothing/under/rank/security/navyblue/russian
name = "\improper Russian officer's uniform"
desc = "The latest in fashionable russian outfits."
+12
View File
@@ -133,6 +133,18 @@
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
/datum/crafting_recipe/minigun
name = "Laser Minigun"
result = /obj/item/minigunpack2
reqs = list(/obj/item/gun/energy/laser/carbine = 3,
/obj/item/stack/sheet/plasteel = 5,
/obj/item/stack/cable_coil = 30,
/obj/item/stock_parts/cell/bluespace = 2)
tools = list(TOOL_WIRECUTTER, TOOL_SCREWDRIVER, TOOL_WELDER)
time = 150
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
/datum/crafting_recipe/ed209
name = "ED209"
result = /mob/living/simple_animal/bot/ed209
+1 -1
View File
@@ -77,7 +77,7 @@
if(LAZYLEN(candidates))
var/mob/dead/observer/C = pick(candidates)
santa = new /mob/living/carbon/human(pick(GLOB.blobstart))
santa.key = C.key
C.transfer_ckey(santa, FALSE)
santa.equipOutfit(/datum/outfit/santa)
santa.update_icons()
+1 -1
View File
@@ -48,7 +48,7 @@
spawned_animals++
SA.key = SG.key
SG.transfer_ckey(SA, FALSE)
SA.grant_all_languages(TRUE)
+1 -1
View File
@@ -23,7 +23,7 @@
I.name = I.dna.real_name
I.updateappearance(mutcolor_update=1)
I.domutcheck()
I.key = C.key
C.transfer_ckey(I, FALSE)
var/datum/antagonist/wizard/master = M.has_antag_datum(/datum/antagonist/wizard)
if(!master.wiz_team)
master.create_wiz_team()
@@ -16,6 +16,7 @@
//Possible_states has the reagent id as key and a list of, in order, the icon_state, the name and the desc as values. Used in the on_reagent_change(changetype) to change names, descs and sprites.
var/list/possible_states = list(
"ketchup" = list("ketchup", "ketchup bottle", "You feel more American already."),
"mustard" = list("mustard", "mustard bottle", "A spice mixed with enzymes and water."),
"capsaicin" = list("hotsauce", "hotsauce bottle", "You can almost TASTE the stomach ulcers now!"),
"enzyme" = list("enzyme", "universal enzyme bottle", "Used in cooking various dishes"),
"soysauce" = list("soysauce", "soy sauce bottle", "A salty soy-based flavoring"),
@@ -282,6 +283,12 @@
originalname = "ketchup"
list_reagents = list("ketchup" = 10)
//Mustard
/obj/item/reagent_containers/food/condiment/pack/mustard
name = "mustard pack"
originalname = "mustard"
list_reagents = list("mustard" = 10)
//Hot sauce
/obj/item/reagent_containers/food/condiment/pack/hotsauce
name = "hotsauce pack"
@@ -335,7 +335,7 @@ obj/item/reagent_containers/food/snacks/store/cake/pound_cake
icon_state = "vanillacake"
slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/vanilla_slice
bonus_reagents = list("sugar" = 15, "vanilla" = 15)
tastes = list("caje" = 1, "sugar" = 1, "vanilla" = 10)
tastes = list("cake" = 1, "sugar" = 1, "vanilla" = 10)
foodtype = GRAIN | SUGAR | DAIRY
/obj/item/reagent_containers/food/snacks/cakeslice/vanilla_slice
@@ -361,4 +361,21 @@ obj/item/reagent_containers/food/snacks/store/cake/pound_cake
icon_state = "clowncake_slice"
filling_color = "#00FFFF"
tastes = list("cake" = 1, "sugar" = 1, "joy" = 10)
foodtype = GRAIN | SUGAR | DAIRY
foodtype = GRAIN | SUGAR | DAIRY
/obj/item/reagent_containers/food/snacks/store/cake/peach_cake
name = "peach cake"
desc = "A peach filled cake."
icon_state = "peachcake"
slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/peach_slice
bonus_reagents = list("sugar" = 5, "peachjuice" = 15)
tastes = list("cake" = 1, "sugar" = 1, "peachjuice" = 10)
foodtype = GRAIN | SUGAR | DAIRY
/obj/item/reagent_containers/food/snacks/cakeslice/peach_slice
name = "peach cake slice"
desc = "A slice of peach cake."
icon_state = "peach_slice"
filling_color = "#00FFFF"
tastes = list("cake" = 1, "sugar" = 1, "peachjuice" = 10)
foodtype = GRAIN | SUGAR | DAIRY
@@ -28,6 +28,50 @@
tastes = list("ice cream" = 1, "banana" = 1, "a bad joke" = 1)
foodtype = FRUIT | DAIRY | SUGAR
/obj/item/reagent_containers/food/snacks/banana_split
name = "banana split"
trash = /obj/item/reagent_containers/food/drinks/drinkingglass
desc = "A long glass dish filled with ice-cream, chocolate and a banana down the middle. A timeless classic by any standards."
icon_state = "banana_split"
bonus_reagents = list("nutriment" = 5, "vitamin" = 3)
list_reagents = list("nutriment" = 3, "banana" = 10, "vitamin" = 2)
filling_color = "#FFFACD"
tastes = list("ice cream" = 1, "banana" = 1, "charries" = 1)
foodtype = FRUIT | DAIRY | SUGAR
/obj/item/reagent_containers/food/snacks/cola_float
name = "Root Beer Float"
trash = /obj/item/reagent_containers/food/drinks/drinkingglass
desc = "A glass filled with cream, soda and ice-cream with a cherry on top."
icon_state = "cola_float"
bonus_reagents = list("nutriment" = 3, "vitamin" = 1)
list_reagents = list("nutriment" = 3, "vitamin" = 2)
filling_color = "#FFFACD"
tastes = list("ice cream" = 1, "space coal" = 1, "cherries" = 1)
foodtype = FRUIT | DAIRY | SUGAR
/obj/item/reagent_containers/food/snacks/charrie_float
name = "Cherry Shake"
trash = /obj/item/reagent_containers/food/drinks/drinkingglass
desc = "Cherries mixed with ice-cream, known for its filling tastes"
icon_state = "cherryshake"
bonus_reagents = list("nutriment" = 3, "vitamin" = 1)
list_reagents = list("nutriment" = 3, "vitamin" = 2, "cherryshake" = 15)
filling_color = "#FFFACD"
tastes = list("ice cream" = 1, "charries" = 1)
foodtype = FRUIT | DAIRY | SUGAR
/obj/item/reagent_containers/food/snacks/bluecharrie_float
name = "Blue Cherry Shake"
trash = /obj/item/reagent_containers/food/drinks/drinkingglass
desc = "Cherries mixed with ice-cream, known for its filling tastes. This one is a exotic blue!"
icon_state = "bluecherryshake"
bonus_reagents = list("nutriment" = 3, "vitamin" = 1)
list_reagents = list("nutriment" = 3, "vitamin" = 2, "bluecherryshake" = 10)
filling_color = "#FFFACD"
tastes = list("ice cream" = 1, "blue cherries" = 1)
foodtype = FRUIT | DAIRY | SUGAR
/obj/item/reagent_containers/food/snacks/spacefreezy
name = "space freezy"
desc = "The best icecream in space."
@@ -126,6 +170,22 @@
tastes = list("ice" = 1, "water" = 1, "berries" = 5)
foodtype = FRUIT
/obj/item/reagent_containers/food/snacks/snowcones/peach
name = "peach flavored snowcone"
desc = "A peach flavord snowball in a paper cup."
icon_state = "peach_sc"
list_reagents = list("nutriment" = 1, "peachjuice" = 10)
tastes = list("ice" = 1, "water" = 1, " peach" = 5)
foodtype = FRUIT
/obj/item/reagent_containers/food/snacks/snowcones/strawberry
name = "strawberry flavored snowcone"
desc = "A strawberry flavord snowball in a paper cup."
icon_state = "blue_sc"
list_reagents = list("nutriment" = 1, "berryjuice" = 10)
tastes = list("ice" = 1, "water" = 1, " strawberry" = 5)
foodtype = FRUIT
/obj/item/reagent_containers/food/snacks/snowcones/fruitsalad
name = "mixed fruit flavored snowcone"
desc = "A mix of different flavors dizzled on a snowball in a paper cup."
@@ -322,6 +322,14 @@
filling_color = "#800000"
tastes = list("meat" = 1, "butter" = 1)
/obj/item/reagent_containers/food/snacks/corndog
name = "corndog plate"
desc = "A plate with two small corn dogs, with two dimples of ketchup and mustard to dip them in."
icon_state = "dorndog"
trash = /obj/item/trash/plate/alt
tastes = list("hotdog" = 2, "mustard and ketchup" = 1, "fryed bread" = 1)
bonus_reagents = list("nutriment" = 6, "vitamin" = 2, "mustard" = 5, "ketchup" = 5)
/obj/item/reagent_containers/food/snacks/kebab/rat
name = "rat-kebab"
desc = "Not so delicious rat meat, on a stick."
@@ -581,6 +581,14 @@
icon_state = "chocolatestrawberry"
list_reagents = list("sugar" = 5, "nutriment" = 2)
filling_color = "#ffdf26"
w_class = WEIGHT_CLASS_NORMAL
tastes = list("strawberries" = 5, "chocolate" = 3)
foodtype = FRUIT | SUGAR
/obj/item/reagent_containers/food/snacks/chocolatebanana
name = "Chocolate dipped banana"
desc = "A banana dipped in a bit of chocolate and held on a stick."
icon_state = "banana_coco"
list_reagents = list("sugar" = 5, "nutriment" = 3, "vitamin" = 1)
filling_color = "#ffdf26"
tastes = list("banana" = 5, "chocolate" = 3)
foodtype = FRUIT | SUGAR
@@ -319,8 +319,16 @@
/obj/item/reagent_containers/food/snacks/pie/strawberrypie
name = "strawberry pie"
desc = "A strawberry.pie."
desc = "A strawberry pie."
icon_state = "strawberrypie"
bonus_reagents = list("nutriment" = 6, "vitamin" = 6)
tastes = list("strawberry" = 1, "pie" = 1)
foodtype = GRAIN | FRUIT | SUGAR
/obj/item/reagent_containers/food/snacks/pie/peachpie
name = "peach pie"
desc = "A pie with peach filling."
icon_state = "strawberrypie"
bonus_reagents = list("nutriment" = 5, "vitamin" = 6, "peachjuice" = 15)
tastes = list("peach" = 1, "pie" = 1)
foodtype = GRAIN | FRUIT
@@ -1,9 +1,13 @@
#define ICECREAM_VANILLA 1
#define ICECREAM_CHOCOLATE 2
#define ICECREAM_STRAWBERRY 3
#define ICECREAM_BLUE 4
#define CONE_WAFFLE 5
#define CONE_CHOC 6
#define ICECREAM_PEACH 4
#define ICECREAM_GRAPE 5
#define ICECREAM_BLUE 6
#define CONE_WAFFLE 7
#define CONE_CHOC 8
/obj/machinery/icecream_vat
name = "ice cream vat"
@@ -26,7 +30,9 @@
"cocoa" = 5,
"vanilla" = 5,
"berryjuice" = 5,
"singulo" = 5)
"singulo" = 5,
"peachjuice" = 5,
"grapejuice" = 5)
/obj/machinery/icecream_vat/proc/get_ingredient_list(type)
switch(type)
@@ -34,6 +40,10 @@
return list("milk", "ice", "cocoa")
if(ICECREAM_STRAWBERRY)
return list("milk", "ice", "berryjuice")
if(ICECREAM_PEACH)
return list("milk", "ice", "peachjuice")
if(ICECREAM_GRAPE)
return list("milk", "ice", "grapejuice")
if(ICECREAM_BLUE)
return list("milk", "ice", "singulo")
if(CONE_WAFFLE)
@@ -50,6 +60,10 @@
return "chocolate"
if(ICECREAM_STRAWBERRY)
return "strawberry"
if(ICECREAM_PEACH)
return "peach"
if(ICECREAM_GRAPE)
return "grape"
if(ICECREAM_BLUE)
return "blue"
if(CONE_WAFFLE)
@@ -62,7 +76,7 @@
/obj/machinery/icecream_vat/Initialize()
. = ..()
while(product_types.len < 6)
while(product_types.len < 8)
product_types.Add(5)
create_reagents(100, OPENCONTAINER | NO_REACT)
for(var/reagent in icecream_vat_reagents)
@@ -76,6 +90,8 @@
dat += "<b>Vanilla ice cream:</b> <a href='?src=[REF(src)];select=[ICECREAM_VANILLA]'><b>Select</b></a> <a href='?src=[REF(src)];make=[ICECREAM_VANILLA];amount=1'><b>Make</b></a> <a href='?src=[REF(src)];make=[ICECREAM_VANILLA];amount=5'><b>x5</b></a> [product_types[ICECREAM_VANILLA]] scoops left. (Ingredients: milk, ice)<br>"
dat += "<b>Strawberry ice cream:</b> <a href='?src=[REF(src)];select=[ICECREAM_STRAWBERRY]'><b>Select</b></a> <a href='?src=[REF(src)];make=[ICECREAM_STRAWBERRY];amount=1'><b>Make</b></a> <a href='?src=[REF(src)];make=[ICECREAM_STRAWBERRY];amount=5'><b>x5</b></a> [product_types[ICECREAM_STRAWBERRY]] dollops left. (Ingredients: milk, ice, berry juice)<br>"
dat += "<b>Chocolate ice cream:</b> <a href='?src=[REF(src)];select=[ICECREAM_CHOCOLATE]'><b>Select</b></a> <a href='?src=[REF(src)];make=[ICECREAM_CHOCOLATE];amount=1'><b>Make</b></a> <a href='?src=[REF(src)];make=[ICECREAM_CHOCOLATE];amount=5'><b>x5</b></a> [product_types[ICECREAM_CHOCOLATE]] dollops left. (Ingredients: milk, ice, coco powder)<br>"
dat += "<b>Peach ice cream:</b> <a href='?src=[REF(src)];select=[ICECREAM_PEACH]'><b>Select</b></a> <a href='?src=[REF(src)];make=[ICECREAM_PEACH];amount=1'><b>Make</b></a> <a href='?src=[REF(src)];make=[ICECREAM_PEACH];amount=5'><b>x5</b></a> [product_types[ICECREAM_PEACH]] dollops left. (Ingredients: milk, ice, peach juice)<br>"
dat += "<b>Grape ice cream:</b> <a href='?src=[REF(src)];select=[ICECREAM_GRAPE]'><b>Select</b></a> <a href='?src=[REF(src)];make=[ICECREAM_GRAPE];amount=1'><b>Make</b></a> <a href='?src=[REF(src)];make=[ICECREAM_GRAPE];amount=5'><b>x5</b></a> [product_types[ICECREAM_GRAPE]] dollops left. (Ingredients: milk, ice, grape juice)<br>"
dat += "<b>Blue ice cream:</b> <a href='?src=[REF(src)];select=[ICECREAM_BLUE]'><b>Select</b></a> <a href='?src=[REF(src)];make=[ICECREAM_BLUE];amount=1'><b>Make</b></a> <a href='?src=[REF(src)];make=[ICECREAM_BLUE];amount=5'><b>x5</b></a> [product_types[ICECREAM_BLUE]] dollops left. (Ingredients: milk, ice, singulo)<br></div>"
dat += "<br><b>CONES</b><br><div class='statusDisplay'>"
dat += "<b>Waffle cones:</b> <a href='?src=[REF(src)];cone=[CONE_WAFFLE]'><b>Dispense</b></a> <a href='?src=[REF(src)];make=[CONE_WAFFLE];amount=1'><b>Make</b></a> <a href='?src=[REF(src)];make=[CONE_WAFFLE];amount=5'><b>x5</b></a> [product_types[CONE_WAFFLE]] cones left. (Ingredients: flour, sugar)<br>"
@@ -207,6 +223,12 @@
if ("strawberry")
desc = "A delicious [cone_type] cone filled with strawberry ice cream. Definitely not made with real strawberries."
reagents.add_reagent("berryjuice", 2)
if ("peach")
desc = "A delicious [cone_type] cone filled with peach ice cream. Definitely made with real peaches!"
reagents.add_reagent("peachjuice", 2)
if ("grape")
desc = "A delicious [cone_type] cone filled with grape ice cream. Surprisingly, made with real pink grape, likely not real sugarcanes used."
reagents.add_reagent("grapejuice", 2)
if ("blue")
desc = "A delicious [cone_type] cone filled with blue ice cream. Made with real... blue?"
reagents.add_reagent("singulo", 2)
@@ -228,6 +250,8 @@
#undef ICECREAM_VANILLA
#undef ICECREAM_CHOCOLATE
#undef ICECREAM_STRAWBERRY
#undef ICECREAM_PEACH
#undef ICECREAM_GRAPE
#undef ICECREAM_BLUE
#undef CONE_WAFFLE
#undef CONE_CHOC
@@ -144,6 +144,13 @@
else
O.forceMove(src)
return TRUE
///Really simple proc, just moves the object "O" into the hands of mob "M" if able, done so I could modify the proc a little for the organ fridge
/obj/machinery/smartfridge/proc/dispense(obj/item/O, var/mob/M)
if(!M.put_in_hands(O))
O.forceMove(drop_location())
adjust_item_drop_location(O)
/obj/machinery/smartfridge/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
@@ -197,9 +204,7 @@
if(desired == 1 && Adjacent(usr) && !issilicon(usr))
for(var/obj/item/O in src)
if(O.name == params["name"])
if(!usr.put_in_hands(O))
O.forceMove(drop_location())
adjust_item_drop_location(O)
dispense(O, usr)
break
if (visible_contents)
update_icon()
@@ -209,8 +214,7 @@
if(desired <= 0)
break
if(O.name == params["name"])
O.forceMove(drop_location())
adjust_item_drop_location(O)
dispense(O, usr)
desired--
if (visible_contents)
update_icon()
@@ -378,6 +382,44 @@
/obj/machinery/smartfridge/extract/preloaded
initial_contents = list(/obj/item/slime_scanner = 2)
// ------------------------- You think you're better than Chem, huh?
// Organ Surgery Smartfridge
// ------------------------- Just wait till Tamiorgans
/obj/machinery/smartfridge/organ
name = "smart organ storage"
desc = "A refrigerated storage unit for organ storage."
max_n_of_items = 20 //vastly lower to prevent processing too long
var/repair_rate = 0
/obj/machinery/smartfridge/organ/accept_check(obj/item/O)
if(istype(O, /obj/item/organ))
return TRUE
return FALSE
/obj/machinery/smartfridge/organ/load(obj/item/O)
. = ..()
if(!.) //if the item loads, clear can_decompose
return
var/obj/item/organ/organ = O
organ.organ_flags |= ORGAN_FROZEN
/obj/machinery/smartfridge/organ/RefreshParts()
for(var/obj/item/stock_parts/matter_bin/B in component_parts)
max_n_of_items = 20 * B.rating
repair_rate = max(0, STANDARD_ORGAN_HEALING * (B.rating - 1))
/obj/machinery/smartfridge/organ/process()
for(var/organ in contents)
var/obj/item/organ/O = organ
if(!istype(O))
return
O.applyOrganDamage(-repair_rate)
/obj/machinery/smartfridge/organ/Exited(obj/item/organ/AM, atom/newLoc)
. = ..()
if(istype(AM))
AM.organ_flags &= ~ORGAN_FROZEN
// -----------------------------
// Chemistry Medical Smartfridge
// -----------------------------
@@ -397,13 +397,16 @@
FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics
FermiExplode = FALSE //If the chemical explodes in a special way
PurityMin = 0 //The minimum purity something has to be above, otherwise it explodes.
clear_conversion = REACTION_CLEAR_INVERSE
/*
/datum/chemical_reaction/neurotoxin/FermiFinish(datum/reagents/holder, var/atom/my_atom)
var/datum/reagent/consumable/ethanol/neurotoxin/Nt = locate(/datum/reagent/consumable/ethanol/neurotoxin) in my_atom.reagents.reagent_list
var/cached_volume = Nt.volume
if(Nt.purity < 0.5)
holder.remove_reagent(src.id, cached_volume)
holder.add_reagent("neuroweak", cached_volume)
*/
/datum/chemical_reaction/neurotoxin/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH)//reduced size
volume = volume/10
@@ -481,18 +484,6 @@
results = list("vanillapudding" = 20)
required_reagents = list("vanilla" = 5, "milk" = 5, "eggyolk" = 5)
/datum/chemical_reaction/cherryshake
name = "Cherry Shake"
id = "cherryshake"
results = list("cherryshake" = 3)
required_reagents = list("cherryjelly" = 1, "ice" = 1, "cream" = 1)
/datum/chemical_reaction/bluecherryshake
name = "Blue Cherry Shake"
id = "bluecherryshake"
results = list("bluecherryshake" = 3)
required_reagents = list("bluecherryjelly" = 1, "ice" = 1, "cream" = 1)
/datum/chemical_reaction/drunkenblumpkin
name = "Drunken Blumpkin"
id = "drunkenblumpkin"
@@ -828,10 +819,10 @@
id = "catnip_tea"
results = list("catnip_tea" = 3)
required_reagents = list("tea" = 5, "catnip" = 2)
/datum/chemical_reaction/commander_and_chief
name = "Commander and Chief"
id = "commander_and_chief"
results = list("commander_and_chief" = 50)
name = "Commander and Chief"
id = "commander_and_chief"
results = list("commander_and_chief" = 50)
required_reagents = list("alliescocktail" = 50, "champagne" = 20, "doctorsdelight" = 10, "quintuple_sec" = 10, "screwdrivercocktail" = 10)
mix_message = "When your powers combine, I am Captain Pl-..."
mix_message = "When your powers combine, I am Captain Pl-..."
@@ -169,6 +169,15 @@
result = /obj/item/reagent_containers/food/snacks/store/cake/vanilla_cake
subcategory = CAT_CAKE
/datum/crafting_recipe/food/peachcake
name = "Peach cake"
reqs = list(
/obj/item/reagent_containers/food/snacks/store/cake/plain = 1,
/obj/item/reagent_containers/food/snacks/grown/peach = 5
)
result = /obj/item/reagent_containers/food/snacks/store/cake/peach_cake
subcategory = CAT_CAKE
/datum/crafting_recipe/food/cak
name = "Living cat/cake hybrid"
reqs = list(
@@ -42,6 +42,52 @@
result = /obj/item/reagent_containers/food/snacks/honkdae
subcategory = CAT_ICE
/datum/crafting_recipe/food/banana_split
name = "Banana Split"
always_availible = FALSE
reqs = list(
/obj/item/reagent_containers/food/snacks/icecream = 3,
/obj/item/reagent_containers/food/snacks/grown/banana = 1,
/obj/item/reagent_containers/food/snacks/grown/cherries = 1,
/obj/item/reagent_containers/food/snacks/chocolatebar = 1
)
result = /obj/item/reagent_containers/food/snacks/banana_split
subcategory = CAT_ICE
/datum/crafting_recipe/food/root_float
name = "Cola Float"
always_availible = FALSE
reqs = list(
/obj/item/reagent_containers/food/snacks/icecream = 1,
/obj/item/reagent_containers/food/snacks/grown/cherries = 1,
/datum/reagent/consumable/space_cola = 10,
/obj/item/reagent_containers/food/drinks/drinkingglass = 1
)
result = /obj/item/reagent_containers/food/snacks/cola_float
subcategory = CAT_ICE
/datum/crafting_recipe/food/charrie_float
name = "Cherry Shake"
always_availible = FALSE
reqs = list(
/obj/item/reagent_containers/food/snacks/icecream = 1,
/obj/item/reagent_containers/food/snacks/grown/cherries = 3,
/obj/item/reagent_containers/food/drinks/drinkingglass = 1
)
result = /obj/item/reagent_containers/food/snacks/charrie_float
subcategory = CAT_ICE
/datum/crafting_recipe/food/bluecharrie_float
name = "Blue Cherry Shake"
always_availible = FALSE
reqs = list(
/obj/item/reagent_containers/food/snacks/icecream = 1,
/obj/item/reagent_containers/food/snacks/grown/bluecherries = 3,
/obj/item/reagent_containers/food/drinks/drinkingglass = 1
)
result = /obj/item/reagent_containers/food/snacks/bluecharrie_float
subcategory = CAT_ICE
//////////////////////////SNOW CONES///////////////////////
/datum/crafting_recipe/food/flaverless_sc
@@ -232,6 +278,28 @@
result = /obj/item/reagent_containers/food/snacks/snowcones/honey
subcategory = CAT_ICE
/datum/crafting_recipe/food/peach_sc
name = "Peach snowcone"
reqs = list(
/obj/item/reagent_containers/food/drinks/sillycup = 1,
/datum/reagent/water = 5,
/datum/reagent/consumable/ice = 15,
/obj/item/reagent_containers/food/snacks/grown/peach = 1
)
result = /obj/item/reagent_containers/food/snacks/snowcones/peach
subcategory = CAT_ICE
/datum/crafting_recipe/food/strawberry_sc
name = "Strawberry snowcone"
reqs = list(
/obj/item/reagent_containers/food/drinks/sillycup = 1,
/datum/reagent/water = 5,
/datum/reagent/consumable/ice = 15,
/obj/item/reagent_containers/food/snacks/grown/strawberry = 2
)
result = /obj/item/reagent_containers/food/snacks/snowcones/strawberry
subcategory = CAT_ICE
/datum/crafting_recipe/food/honey_sc
name = "Rainbow snowcone"
reqs = list(
@@ -128,6 +128,18 @@
result = /obj/item/reagent_containers/food/snacks/pigblanket
subcategory = CAT_MEAT
/datum/crafting_recipe/food/corndog
name = "Corndog meal"
reqs = list(
/obj/item/stack/rods = 1,
/obj/item/reagent_containers/food/snacks/meat/cutlet = 1,
/obj/item/reagent_containers/food/snacks/bun = 1,
/datum/reagent/consumable/mustard = 5,
/datum/reagent/consumable/ketchup = 5
)
result = /obj/item/reagent_containers/food/snacks/corndog
subcategory = CAT_MEAT
/datum/crafting_recipe/food/ratkebab
name = "Rat Kebab"
reqs = list(
@@ -214,4 +214,13 @@
/obj/item/slime_extract = 1
)
result = /obj/item/reagent_containers/food/snacks/pie/cocolavatart
subcategory = CAT_PIE
/datum/crafting_recipe/food/peachpie
name = "Peach Pie"
reqs = list(
/obj/item/reagent_containers/food/snacks/pie/plain = 1,
/obj/item/reagent_containers/food/snacks/grown/peach = 3
)
result = /obj/item/reagent_containers/food/snacks/pie/peachpie
subcategory = CAT_PIE
+7 -12
View File
@@ -82,11 +82,13 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico
if("setMusicVolume")
data = setMusicVolume(arglist(params))
if("swaptodarkmode")
swaptodarkmode()
if("colorPresetPost") //User just swapped color presets in their goonchat preferences. Do we do anything else?
switch(href_list["preset"])
if("light")
owner.force_white_theme()
if("dark" || "normal")
owner.force_dark_theme()
if("swaptolightmode")
swaptolightmode()
if(data)
ehjax_send(data = data)
@@ -160,7 +162,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico
var/list/row = src.connectionHistory[i]
if (!row || row.len < 3 || (!row["ckey"] || !row["compid"] || !row["ip"])) //Passed malformed history object
return
if (world.IsBanned(row["ckey"], row["compid"], row["ip"], real_bans_only=TRUE))
if (world.IsBanned(row["ckey"], row["ip"], row["compid"], real_bans_only=TRUE))
found = row
break
@@ -246,10 +248,3 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico
// url_encode it TWICE, this way any UTF-8 characters are able to be decoded by the Javascript.
C << output(url_encode(url_encode(message)), "browseroutput:output")
/datum/chatOutput/proc/swaptolightmode() //Dark mode light mode stuff. Yell at KMC if this breaks! (See darkmode.dm for documentation)
owner.force_white_theme()
/datum/chatOutput/proc/swaptodarkmode()
owner.force_dark_theme()
@@ -7,20 +7,16 @@ html, body {
padding: 0;
margin: 0;
height: 100%;
color: #f0f0f0;
color: #000000;
}
body {
background: #171717;
background: #E0E0E0; /*CIT CHANGE - darkens chatbox a lil*/
font-family: Verdana, sans-serif;
font-size: 9pt;
font-color: #f0f0f0;
line-height: 1.2;
overflow-x: hidden;
overflow-y: scroll;
word-wrap: break-word;
scrollbar-face-color:#1A1A1A;
scrollbar-track-color:#171717;
scrollbar-highlight-color:#171717;
word-wrap: break-word;
}
em {
@@ -60,9 +56,9 @@ img.icon {
border-radius: 10px;
}
a {color: #397ea5;}
a.visited {color: #7c00e6;}
a:visited {color: #7c00e6;}
a {color: #0000ff;}
a.visited {color: #ff00ff;}
a:visited {color: #ff00ff;}
a.popt {text-decoration: none;}
/*****************************************
@@ -93,21 +89,21 @@ a.popt {text-decoration: none;}
bottom: 0;
right: 0;
padding: 8px;
background: #202020;
background: #d0d0d0;
text-decoration: none;
font-variant: small-caps;
font-size: 1.1em;
font-weight: bold;
color: #a4bad6;
color: #333;
}
#newMessages:hover {background: #171717;}
#newMessages:hover {background: #ccc;}
#newMessages i {vertical-align: middle; padding-left: 3px;}
#ping {
position: fixed;
top: 0;
right: 115px;
width: 45px;
background: #202020;
background: #d0d0d0;
height: 30px;
padding: 8px 0 2px 0;
}
@@ -124,19 +120,19 @@ a.popt {text-decoration: none;}
right: 0;
}
#userBar .subCell {
background: #202020;
background: #d0d0d0;
height: 30px;
padding: 5px 0;
display: block;
color: #a4bad6;
color: #333;
text-decoration: none;
line-height: 28px;
border-top: 1px solid #171717;
border-top: 1px solid #b4b4b4;
}
#userBar .subCell:hover {background: #202020;}
#userBar .subCell:hover {background: #ccc;}
#userBar .toggle {
width: 40px;
background: #202020;
background: #ccc;
border-top: 0;
float: right;
text-align: center;
@@ -172,7 +168,7 @@ a.popt {text-decoration: none;}
position: fixed;
top: 50%;
left: 50%;
background: #ddd;
background: #d0d0d0;
}
.popup .close {
position: absolute;
@@ -189,7 +185,7 @@ a.popt {text-decoration: none;}
.popup .close:hover {background: #999;}
.popup .head {
background: #999;
color: #ddd;
color: #d0d0d0;
padding: 0 10px;
height: 30px;
line-height: 30px;
@@ -200,7 +196,7 @@ a.popt {text-decoration: none;}
}
.popup input {border: 1px solid #999; background: #fff; margin: 0; padding: 5px; outline: none; color: #333;}
.popup input[type=text]:hover, .popup input[type=text]:active, .popup input[type=text]:focus {border-color: green;}
.popup input[type=submit] {padding: 5px 10px; background: #999; color: #ddd; text-transform: uppercase; font-size: 0.9em; font-weight: bold;}
.popup input[type=submit] {padding: 5px 10px; background: #999; color: #d0d0d0; text-transform: uppercase; font-size: 0.9em; font-weight: bold;}
.popup input[type=submit]:hover, .popup input[type=submit]:focus, .popup input[type=submit]:active {background: #aaa; cursor: pointer;}
.changeFont {padding: 10px;}
@@ -214,7 +210,7 @@ a.popt {text-decoration: none;}
/* ADMIN CONTEXT MENU */
.contextMenu {
background-color: #ddd;
background-color: #d0d0d0;
position: fixed;
margin: 2px;
width: 150px;
@@ -246,9 +242,9 @@ a.popt {text-decoration: none;}
******************************************/
/* MOTD */
.motd {color: #a4bad6; font-family: Verdana, sans-serif;}
.motd h1, .motd h2, .motd h3, .motd h4, .motd h5, .motd h6 {color: #a4bad6; text-decoration: underline;}
.motd a, .motd a:link, .motd a:visited, .motd a:active, .motd a:hover {color: #a4bad6;}
.motd {color: #638500; font-family: Verdana, sans-serif;}
.motd h1, .motd h2, .motd h3, .motd h4, .motd h5, .motd h6 {color: #638500; text-decoration: underline;}
.motd a, .motd a:link, .motd a:visited, .motd a:active, .motd a:hover {color: #638500;}
/* ADD HERE FOR BOLD */
.bold, .name, .prefix, .ooc, .looc, .adminooc, .admin, .medal, .yell {font-weight: bold;}
@@ -259,90 +255,91 @@ a.popt {text-decoration: none;}
/* OUTPUT COLORS */
.highlight {background: yellow;}
h1, h2, h3, h4, h5, h6 {color: #a4bad6;font-family: Georgia, Verdana, sans-serif;}
h1.alert, h2.alert {color: #a4bad6;}
h1, h2, h3, h4, h5, h6 {color: #0000ff;font-family: Georgia, Verdana, sans-serif;}
h1.alert, h2.alert {color: #000000;}
em {font-style: normal; font-weight: bold;}
.ooc {color: #cca300; font-weight: bold;}
.antagooc {color: #ce254f; font-weight: bold;}
.ooc {color: #002eb8; font-weight: bold;}
.looc {color: #6699CC; font-weight: bold;}
.antagooc {color: #b8002e; font-weight: bold;}
.adminobserverooc {color: #0099cc; font-weight: bold;}
.adminooc {color: #3d5bc3; font-weight: bold;}
.adminooc {color: #700038; font-weight: bold;}
.adminsay {color: #ff4500; font-weight: bold;}
.admin {color: #5975da; font-weight: bold;}
.adminsay {color: #FF4500}
.admin {color: #386aff; font-weight: bold;}
.name { font-weight: bold;}
.say {}
.deadsay {color: #e2c1ff;}
.deadsay {color: #5c00e6;}
.binarysay {color: #20c20e; background-color: #000000; display: block;}
.binarysay a {color: #00ff00;}
.binarysay a:active, .binarysay a:visited {color: #88ff88;}
.radio {color: #1ecc43;}
.sciradio {color: #c68cfa;}
.comradio {color: #5177ff;}
.secradio {color: #dd3535;}
.medradio {color: #57b8f0;}
.engradio {color: #f37746;}
.suppradio {color: #b88646;}
.servradio {color: #6ca729;}
.syndradio {color: #8f4a4b;}
.centcomradio {color: #2681a5;}
.aiprivradio {color: #d65d95;}
.redteamradio {color: #ff4444;}
.blueteamradio {color: #3434fd;}
.radio {color: #008000;}
.sciradio {color: #993399;}
.comradio {color: #948f02;}
.secradio {color: #a30000;}
.medradio {color: #337296;}
.engradio {color: #fb5613;}
.suppradio {color: #a8732b;}
.servradio {color: #6eaa2c;}
.syndradio {color: #6d3f40;}
.centcomradio {color: #686868;}
.aiprivradio {color: #ff00ff;}
.redteamradio {color: #ff0000;}
.blueteamradio {color: #0000ff;}
.yell { font-weight: bold;}
.alert {color: #d82020;}
h1.alert, h2.alert {color: #99aab5;}
.alert {color: #ff0000;}
h1.alert, h2.alert {color: #000000;}
.emote { font-style: italic;}
.selecteddna {color: #ffffff; background-color: #001B1B}
.attack {color: #e01c1c;}
.disarm {color: #b42525;}
.passive {color: #a00f0f;}
.attack {color: #ff0000;}
.disarm {color: #990000;}
.passive {color: #660000;}
.userdanger {color: #c51e1e; font-weight: bold; font-size: 24px;}
.danger {color: #c51e1e;}
.warning {color: #c51e1e; font-style: italic;}
.userdanger {color: #ff0000; font-weight: bold; font-size: 24px;}
.danger {color: #ff0000;}
.warning {color: #ff0000; font-style: italic;}
.alertwarning {color: #FF0000; font-weight: bold}
.boldwarning {color: #c51e1e; font-style: italic; font-weight: bold}
.announce {color: #c51e1e; font-weight: bold;}
.boldannounce {color: #c51e1e; font-weight: bold;}
.greenannounce {color: #059223; font-weight: bold;}
.boldwarning {color: #ff0000; font-style: italic; font-weight: bold}
.announce {color: #228b22; font-weight: bold;}
.boldannounce {color: #ff0000; font-weight: bold;}
.greenannounce {color: #00ff00; font-weight: bold;}
.rose {color: #ff5050;}
.info {color: #6685f5;}
.notice {color: #6685f5;}
.boldnotice {color: #6685f5; font-weight: bold;}
.adminnotice {color: #6685f5;}
.info {color: #0000CC;}
.notice {color: #000099;}
.boldnotice {color: #000099; font-weight: bold;}
.adminnotice {color: #0000ff;}
.adminhelp {color: #ff0000; font-weight: bold;}
.unconscious {color: #a4bad6; font-weight: bold;}
.unconscious {color: #0000ff; font-weight: bold;}
.suicide {color: #ff5050; font-style: italic;}
.red {color: #FF0000}
.pink {color: #ff70c1;}
.blue {color: #215cff}
.green {color: #059223;}
.nicegreen {color: #059223;}
.green {color: #03ff39;}
.red {color: #FF0000;}
.pink {color: #FF69Bf;}
.blue {color: #0000FF;}
.nicegreen {color: #14a833;}
.userlove {color: #FF1493; font-style: italic; font-weight: bold; text-shadow: 0 0 6px #ff6dbc;}
.love {color: #ff006a; font-style: italic; text-shadow: 0 0 6px #ff6d6d;}
.shadowling {color: #8e8a99;}
.cult {color: #aa1c1c;}
.shadowling {color: #3b2769;}
.cult {color: #960000;}
.cultitalic {color: #aa1c1c; font-style: italic;}
.cultbold {color: #aa1c1c; font-style: italic; font-weight: bold;}
.cultboldtalic {color: #aa1c1c; font-weight: bold; font-size: 24px;}
.cultitalic {color: #960000; font-style: italic;}
.cultbold {color: #960000; font-style: italic; font-weight: bold;}
.cultboldtalic {color: #960000; font-weight: bold; font-size: 24px;}
.cultlarge {color: #aa1c1c; font-weight: bold; font-size: 24px;}
.narsie {color: #aa1c1c; font-weight: bold; font-size: 120px;}
.narsiesmall {color: #aa1c1c; font-weight: bold; font-size: 48px;}
.cultlarge {color: #960000; font-weight: bold; font-size: 24px;}
.narsie {color: #960000; font-weight: bold; font-size: 120px;}
.narsiesmall {color: #960000; font-weight: bold; font-size: 48px;}
.colossus {color: #7F282A; font-size: 40px;}
.hierophant {color: #b441ee; font-weight: bold; font-style: italic;}
.hierophant_warning {color: #c56bf1; font-style: italic;}
.purple {color: #9956d3;}
.holoparasite {color: #88809c;}
.hierophant {color: #660099; font-weight: bold; font-style: italic;}
.hierophant_warning {color: #660099; font-style: italic;}
.purple {color: #5e2d79;}
.holoparasite {color: #35333a;}
.revennotice {color: #1d2953;}
.revenboldnotice {color: #1d2953; font-weight: bold;}
@@ -350,11 +347,11 @@ h1.alert, h2.alert {color: #99aab5;}
.revenminor {color: #823abb}
.revenwarning {color: #760fbb; font-style: italic;}
.revendanger {color: #760fbb; font-weight: bold; font-size: 24px;}
.umbra {color: #7c00e6;}
.umbra_emphasis {color: #7c00e6; font-weight: bold; font-style: italic;}
.umbra_large {color: #7c00e6; font-size: 24px; font-weight: bold; font-style: italic;}
.umbra {color: #5000A0;}
.umbra_emphasis {color: #5000A0; font-weight: bold; font-style: italic;}
.umbra_large {color: #5000A0; font-size: 24px; font-weight: bold; font-style: italic;}
.deconversion_message {color: #a947ff; font-size: 24px; font-style: italic;}
.deconversion_message {color: #5000A0; font-size: 24px; font-style: italic;}
.brass {color: #BE8700;}
.heavy_brass {color: #BE8700; font-weight: bold; font-style: italic;}
@@ -379,17 +376,17 @@ h1.alert, h2.alert {color: #99aab5;}
.neovgre {color: #6E001A; font-weight: bold; font-style: italic;}
.neovgre_small {color: #6E001A;}
.newscaster {color: #c05d5d;}
.ghostalert {color: #6600ff; font-style: italic; font-weight: bold;}
.newscaster {color: #800000;}
.ghostalert {color: #5c00e6; font-style: italic; font-weight: bold;}
.alien {color: #855d85;}
.noticealien {color: #059223;}
.alertalien {color: #059223; font-weight: bold;}
.changeling {color: #059223; font-style: italic;}
.alien {color: #543354;}
.noticealien {color: #00c000;}
.alertalien {color: #00c000; font-weight: bold;}
.changeling {color: #800080; font-style: italic;}
.spider {color: #8800ff;}
.spider {color: #4d004d;}
.interface {color: #750e75;}
.interface {color: #330033;}
.sans {font-family: "Comic Sans MS", cursive, sans-serif;}
.papyrus {font-family: "Papyrus", cursive, sans-serif;}
@@ -400,9 +397,9 @@ h1.alert, h2.alert {color: #99aab5;}
.big {font-size: 24px;}
.reallybig {font-size: 32px;}
.extremelybig {font-size: 40px;}
.greentext {color: #059223; font-size: 24px;}
.redtext {color: #c51e1e; font-size: 24px;}
.clown {color: #ff70c1; font-size: 24px; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;}
.greentext {color: #00FF00; font-size: 24px;}
.redtext {color: #FF0000; font-size: 24px;}
.clown {color: #FF69Bf; font-size: 24px; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;}
.his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;}
.velvet {color: #660015; font-weight: bold; animation: velvet 5000ms infinite;}
@keyframes velvet {
@@ -434,20 +431,20 @@ h1.alert, h2.alert {color: #99aab5;}
.memo {color: #638500; text-align: center;}
.memoedit {text-align: center; font-size: 16px;}
.abductor {color: #c204c2; font-style: italic;}
.mind_control {color: #df3da9; font-size: 3; font-weight: bold; font-style: italic;}
.abductor {color: #800080; font-style: italic;}
.mind_control {color: #A00D6F; font-size: 3; font-weight: bold; font-style: italic;}
.slime {color: #00CED1;}
.drone {color: #848482;}
.monkey {color: #975032;}
.swarmer {color: #2C75FF;}
.resonate {color: #298F85;}
.monkeyhive {color: #a56408;}
.monkeylead {color: #af6805; font-size: 2;}
.monkeyhive {color: #774704;}
.monkeylead {color: #774704; font-size: 2;}
.connectionClosed, .fatalError {background: red; color: white; padding: 5px;}
.connectionClosed.restored {background: green;}
.internal.boldnshit {color: #3d5bc3; font-weight: bold;}
.internal.boldnshit {color: #000099; font-weight: bold;}
/* HELPER CLASSES */
.text-normal {font-weight: normal; font-style: normal;}
@@ -0,0 +1,159 @@
html, body {color: #E0E0E0;}
body {
background: #171717;
font-color: #E0E0E0;
scrollbar-face-color:#1A1A1A;
scrollbar-track-color:#171717;
scrollbar-highlight-color:#171717;
}
a {color: #397ea5;}
a.visited {color: #7c00e6;}
a:visited {color: #7c00e6;}
#newMessages {
background: #242424;
color: #E0E0E0;
}
#newMessages:hover {background: #272727;}
#ping {background: #272727;}
#userBar .subCell {
background: #272727;
color: #E0E0E0;
border-top: 1px solid #171717;
}
#userBar .subCell:hover {background: #272727;}
#userBar .toggle {background: #272727;}
/* MOTD */
.motd {color: #E0E0E0; font-family: Verdana, sans-serif;}
.motd h1, .motd h2, .motd h3, .motd h4, .motd h5, .motd h6 {color: #E0E0E0; text-decoration: underline;}
.motd a, .motd a:link, .motd a:visited, .motd a:active, .motd a:hover {color: #E0E0E0;}
h1, h2, h3, h4, h5, h6 {color: #E0E0E0;font-family: Georgia, Verdana, sans-serif;}
h1.alert, h2.alert {color: #E0E0E0;}
.ooc {color: #cca300; font-weight: bold;}
.looc {color: #d8b555; font-weight: bold;}
.antagooc {color: #ce254f; font-weight: bold;}
.adminobserverooc {color: #0099cc; font-weight: bold;}
.adminooc {color: #3d5bc3; font-weight: bold;}
.admin {color: #5975da; font-weight: bold;}
.deadsay {color: #e2c1ff;}
.radio {color: #1ecc43;}
.sciradio {color: #c68cfa;}
.comradio {color: #5177ff;}
.secradio {color: #dd3535;}
.medradio {color: #57b8f0;}
.engradio {color: #f37746;}
.suppradio {color: #b88646;}
.servradio {color: #6ca729;}
.syndradio {color: #8f4a4b;}
.centcomradio {color: #2681a5;}
.aiprivradio {color: #d65d95;}
.redteamradio {color: #ff4444;}
.blueteamradio {color: #3434fd;}
.alert {color: #d82020;}
h1.alert, h2.alert {color: #99aab5;}
.attack {color: #e01c1c;}
.disarm {color: #b42525;}
.passive {color: #a00f0f;}
.userdanger {color: #c51e1e; font-weight: bold; font-size: 24px;}
.danger {color: #c51e1e;}
.warning {color: #c51e1e; font-style: italic;}
.alertwarning {color: #c51e1e; font-weight: bold}
.boldwarning {color: #c51e1e; font-style: italic; font-weight: bold}
.announce {color: #c51e1e; font-weight: bold;}
.boldannounce {color: #c51e1e; font-weight: bold;}
.greenannounce {color: #059223; font-weight: bold;}
.info {color: #6685f5;}
.notice {color: #6685f5;}
.boldnotice {color: #6685f5; font-weight: bold;}
.adminnotice {color: #6685f5;}
.adminhelp {color: #ff0000; font-weight: bold;}
.unconscious {color: #E0E0E0; font-weight: bold;}
.red {color: #FF0000}
.pink {color: #ff70c1;}
.blue {color: #215cff}
.green {color: #059223;}
.nicegreen {color: #059223;}
.userlove {color: #ff42a6; font-style: italic; font-weight: bold; text-shadow: 0 0 6px #82365e;}
.love {color: #ff4591; font-style: italic; text-shadow: 0 0 6px #994449;}
.shadowling {color: #8e8a99;}
.cult {color: #aa1c1c;}
.cultitalic {color: #aa1c1c; font-style: italic;}
.cultbold {color: #aa1c1c; font-style: italic; font-weight: bold;}
.cultboldtalic {color: #aa1c1c; font-weight: bold; font-size: 24px;}
.cultlarge {color: #aa1c1c; font-weight: bold; font-size: 24px;}
.narsie {color: #aa1c1c; font-weight: bold; font-size: 120px;}
.narsiesmall {color: #aa1c1c; font-weight: bold; font-size: 48px;}
.hierophant {color: #b441ee; font-weight: bold; font-style: italic;}
.hierophant_warning {color: #c56bf1; font-style: italic;}
.purple {color: #9956d3;}
.holoparasite {color: #88809c;}
.revennotice {color: #3645aa;}
.revenboldnotice {color: #3645aa; font-weight: bold;}
.revenbignotice {color: #3645aa; font-weight: bold; font-size: 24px;}
.revenminor {color: #823ddd}
.revenwarning {color: #8911d9; font-style: italic;}
.revendanger {color: #8911d9; font-weight: bold; font-size: 24px;}
.umbra {color: #7c00e6;}
.umbra_emphasis {color: #7c00e6; font-weight: bold; font-style: italic;}
.umbra_large {color: #7c00e6; font-size: 24px; font-weight: bold; font-style: italic;}
.deconversion_message {color: #a947ff; font-size: 24px; font-style: italic;}
.alloy {color: #545b64;}
.heavy_alloy {color: #545b64; font-weight: bold; font-style: italic;}
.nezbere_large {color: #545b64; font-size: 24px; font-weight: bold; font-style: italic;}
.nezbere {color: #545b64; font-weight: bold; font-style: italic;}
.nezbere_small {color: #545b64;}
.inathneq_large {color: #1d7dc7; font-size: 24px; font-weight: bold; font-style: italic;}
.inathneq {color: #1d7dc7; font-weight: bold; font-style: italic;}
.inathneq_small {color: #1d7dc7;}
.neovgre_large {color: #7c0622; font-size: 24px; font-weight: bold; font-style: italic;}
.neovgre {color: #7c0622; font-weight: bold; font-style: italic;}
.neovgre_small {color: #7c0622;}
.newscaster {color: #c05d5d;}
.ghostalert {color: #6600ff; font-style: italic; font-weight: bold;}
.alien {color: #855d85;}
.noticealien {color: #059223;}
.alertalien {color: #059223; font-weight: bold;}
.changeling {color: #059223; font-style: italic;}
.spider {color: #8800ff;}
.interface {color: #750e75;}
.greentext {color: #059223; font-size: 24px;}
.redtext {color: #c51e1e; font-size: 24px;}
.clown {color: #ff70c1; font-size: 24px; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;}
.velvet {color: #660015; font-weight: bold; animation: velvet 5000ms infinite;}
@keyframes velvet {
0% { color: #890020; }
40% { color: #c51e1e; }
50% { color: #FF8888; }
60% { color: #c51e1e; }
100% { color: #890020; }
}
.abductor {color: #c204c2; font-style: italic;}
.mind_control {color: #df3da9; font-size: 3; font-weight: bold; font-style: italic;}
.drone {color: #979795;}
.monkeyhive {color: #a56408;}
.monkeylead {color: #af6805; font-size: 2;}
.internal.boldnshit {color: #3d5bc3; font-weight: bold;}
@@ -1,236 +1,18 @@
/*****************************************
*
* GLOBAL STYLES
*
******************************************/
html, body {
padding: 0;
margin: 0;
height: 100%;
color: #000000;
}
body {
background: #fff;
font-family: Verdana, sans-serif;
font-size: 9pt;
line-height: 1.2;
overflow-x: hidden;
overflow-y: scroll;
word-wrap: break-word;
}
body {background: #F1F1F1;}
em {
font-style: normal;
font-weight: bold;
}
#newMessages {background: #ddd;}
#ping {background: #ddd;}
img {
margin: 0;
padding: 0;
line-height: 1;
-ms-interpolation-mode: nearest-neighbor;
image-rendering: pixelated;
}
img.icon {
height: 1em;
min-height: 16px;
width: auto;
vertical-align: bottom;
}
.r:before { /* "repeated" badge class for combined messages */
content: 'x';
}
.r {
display: inline-block;
min-width: 0.5em;
font-size: 0.7em;
padding: 0.2em 0.3em;
line-height: 1;
color: white;
text-align: center;
white-space: nowrap;
vertical-align: middle;
background-color: crimson;
border-radius: 10px;
}
a {color: #0000ff;}
a.visited {color: #ff00ff;}
a:visited {color: #ff00ff;}
a.popt {text-decoration: none;}
/*****************************************
*
* OUTPUT NOT RELATED TO ACTUAL MESSAGES
*
******************************************/
#loading {
position: fixed;
width: 300px;
height: 150px;
text-align: center;
left: 50%;
top: 50%;
margin: -75px 0 0 -150px;
}
#loading i {display: block; padding-bottom: 3px;}
#messages {
font-size: 13px;
padding: 3px;
margin: 0;
word-wrap: break-word;
}
#newMessages {
position: fixed;
display: block;
bottom: 0;
right: 0;
padding: 8px;
background: #ddd;
text-decoration: none;
font-variant: small-caps;
font-size: 1.1em;
font-weight: bold;
color: #333;
}
#newMessages:hover {background: #ccc;}
#newMessages i {vertical-align: middle; padding-left: 3px;}
#ping {
position: fixed;
top: 0;
right: 115px;
width: 45px;
background: #ddd;
height: 30px;
padding: 8px 0 2px 0;
}
#ping i {display: block; text-align: center;}
#ping .ms {
display: block;
text-align: center;
font-size: 8pt;
padding-top: 2px;
}
#userBar {
position: fixed;
top: 0;
right: 0;
}
#userBar .subCell {
background: #ddd;
height: 30px;
padding: 5px 0;
display: block;
color: #333;
text-decoration: none;
line-height: 28px;
border-top: 1px solid #b4b4b4;
}
#userBar .subCell:hover {background: #ccc;}
#userBar .toggle {
width: 40px;
background: #ccc;
border-top: 0;
float: right;
text-align: center;
}
#userBar .sub {clear: both; display: none; width: 160px;}
#userBar .sub.scroll {overflow-y: scroll;}
#userBar .sub.subCell {padding: 3px 0 3px 8px; line-height: 30px; font-size: 0.9em; clear: both;}
#userBar .sub span {
display: block;
line-height: 30px;
float: left;
}
#userBar .sub i {
display: block;
padding: 0 5px;
font-size: 1.1em;
width: 22px;
text-align: center;
line-height: 30px;
float: right;
}
#userBar .sub input {
position: absolute;
padding: 7px 5px;
width: 121px;
line-height: 30px;
float: left;
}
#userBar .topCell {border-top: 0;}
#userBar .subCell {background: #ddd;}
/* POPUPS */
.popup {
position: fixed;
top: 50%;
left: 50%;
background: #ddd;
}
.popup .close {
position: absolute;
background: #aaa;
top: 0;
right: 0;
color: #333;
text-decoration: none;
z-index: 2;
padding: 0 10px;
height: 30px;
line-height: 30px;
}
.popup .close:hover {background: #999;}
.popup .head {
background: #999;
color: #ddd;
padding: 0 10px;
height: 30px;
line-height: 30px;
text-transform: uppercase;
font-size: 0.9em;
font-weight: bold;
border-bottom: 2px solid green;
}
.popup input {border: 1px solid #999; background: #fff; margin: 0; padding: 5px; outline: none; color: #333;}
.popup input[type=text]:hover, .popup input[type=text]:active, .popup input[type=text]:focus {border-color: green;}
.popup input[type=submit] {padding: 5px 10px; background: #999; color: #ddd; text-transform: uppercase; font-size: 0.9em; font-weight: bold;}
.popup input[type=submit]:hover, .popup input[type=submit]:focus, .popup input[type=submit]:active {background: #aaa; cursor: pointer;}
.changeFont {padding: 10px;}
.changeFont a {display: block; text-decoration: none; padding: 3px; color: #333;}
.changeFont a:hover {background: #ccc;}
.highlightPopup {padding: 10px; text-align: center;}
.highlightPopup input[type=text] {display: block; width: 215px; text-align: left; margin-top: 5px;}
.highlightPopup input.highlightColor {background-color: #FFFF00;}
.highlightPopup input.highlightTermSubmit {margin-top: 5px;}
.popup {background: #ddd;}
.popup .head {color: #ddd;}
.popup input[type=submit] {color: #ddd;}
/* ADMIN CONTEXT MENU */
.contextMenu {
background-color: #ddd;
position: fixed;
margin: 2px;
width: 150px;
}
.contextMenu a {
display: block;
padding: 2px 5px;
text-decoration: none;
color: #333;
}
.contextMenu {background-color: #ddd;}
.contextMenu a:hover {
background-color: #ccc;
}
/* ADMIN FILTER MESSAGES MENU */
.filterMessages {padding: 5px;}
.filterMessages div {padding: 2px 0;}
.filterMessages input {}
.filterMessages label {}
.icon-stack {height: 1em; line-height: 1em; width: 1em; vertical-align: middle; margin-top: -2px;}
@@ -261,12 +43,13 @@ h1.alert, h2.alert {color: #000000;}
em {font-style: normal; font-weight: bold;}
.ooc {color: #002eb8; font-weight: bold;}
.looc {color: #6699CC; font-weight: bold;}
.antagooc {color: #b8002e; font-weight: bold;}
.adminobserverooc {color: #0099cc; font-weight: bold;}
.adminooc {color: #700038; font-weight: bold;}
.adminsay {color: #ff4500; font-weight: bold;}
.admin {color: #4473ff; font-weight: bold;}
.adminsay {color: #FF4500}
.admin {color: #386aff; font-weight: bold;}
.name { font-weight: bold;}
@@ -304,7 +87,7 @@ h1.alert, h2.alert {color: #000000;}
.userdanger {color: #ff0000; font-weight: bold; font-size: 24px;}
.danger {color: #ff0000;}
.warning {color: #ff0000; font-style: italic;}
.alertwarning {color: #FF0000; font-weight: bold}
.alertwarning {color: #FF0000; font-weight: bold}
.boldwarning {color: #ff0000; font-style: italic; font-weight: bold}
.announce {color: #228b22; font-weight: bold;}
.boldannounce {color: #ff0000; font-weight: bold;}
@@ -317,10 +100,10 @@ h1.alert, h2.alert {color: #000000;}
.adminhelp {color: #ff0000; font-weight: bold;}
.unconscious {color: #0000ff; font-weight: bold;}
.suicide {color: #ff5050; font-style: italic;}
.green {color: #03ff39;}
.red {color: #FF0000}
.green {color: #03ff39;}
.red {color: #FF0000;}
.pink {color: #FF69Bf;}
.blue {color: #0000FF}
.blue {color: #0000FF;}
.nicegreen {color: #14a833;}
.userlove {color: #FF1493; font-style: italic; font-weight: bold; text-shadow: 0 0 6px #ff6dbc;}
.love {color: #ff006a; font-style: italic; text-shadow: 0 0 6px #ff6d6d;}
@@ -329,7 +112,7 @@ h1.alert, h2.alert {color: #000000;}
.cultitalic {color: #960000; font-style: italic;}
.cultbold {color: #960000; font-style: italic; font-weight: bold;}
.cultboldtalic {color: #960000; font-weight: bold; font-size: 24px;}
.cultboldtalic {color: #960000; font-weight: bold; font-size: 24px;}
.cultlarge {color: #960000; font-weight: bold; font-size: 24px;}
.narsie {color: #960000; font-weight: bold; font-size: 120px;}
@@ -400,13 +183,38 @@ h1.alert, h2.alert {color: #000000;}
.redtext {color: #FF0000; font-size: 24px;}
.clown {color: #FF69Bf; font-size: 24px; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;}
.his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;}
.velvet {color: #660015; font-weight: bold; animation: velvet 5000ms infinite;}
@keyframes velvet {
0% { color: #400020; }
40% { color: #FF0000; }
50% { color: #FF8888; }
60% { color: #FF0000; }
100% { color: #400020; }
}
.hypnophrase {color: #202020; font-weight: bold; animation: hypnocolor 1500ms infinite;}
@keyframes hypnocolor {
0% { color: #202020; }
25% { color: #4b02ac; }
50% { color: #9f41f1; }
75% { color: #541c9c; }
100% { color: #7adbf3; }
}
.phobia {color: #dd0000; font-weight: bold; animation: phobia 750ms infinite;}
@keyframes phobia {
0% { color: #f75a5a; }
50% { color: #dd0000; }
100% { color: #f75a5a; }
}
.icon {height: 1em; width: auto;}
.memo {color: #638500; text-align: center;}
.memoedit {text-align: center; font-size: 16px;}
.abductor {color: #800080; font-style: italic;}
.mind_control {color: #A00D6F; font-size: 3; font-weight: bold; font-style: italic;}
.mind_control {color: #A00D6F; font-size: 3; font-weight: bold; font-style: italic;}
.slime {color: #00CED1;}
.drone {color: #848482;}
.monkey {color: #975032;}
@@ -418,9 +226,8 @@ h1.alert, h2.alert {color: #000000;}
.connectionClosed, .fatalError {background: red; color: white; padding: 5px;}
.connectionClosed.restored {background: green;}
.internal.boldnshit {color: blue; font-weight: bold;}
.internal.boldnshit {color: #000099; font-weight: bold;}
/* HELPER CLASSES */
.text-normal {font-weight: normal; font-style: normal;}
.hidden {display: none; visibility: hidden;}
@@ -5,8 +5,9 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css" href="font-awesome.css" />
<link id="sheetofstyles" rel="stylesheet" type="text/css" href="browserOutput_white.css" />
<link rel="stylesheet" type="text/css" href="browserOutput.css" />
<link rel="stylesheet" type="text/css" href="spritesheet_chat.css" />
<link rel="stylesheet" type="text/css" id="colorPresetLink"/>
<script type="text/javascript" src="errorHandler.js"></script>
<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript" src="json2.min.js"></script>
@@ -29,7 +30,7 @@
<span class="ms" id="pingMs">--ms</span>
</div>
<div id="darkmodething">
<a href="#" class="subCell toggle" id="darkmodetoggle" title="Darkmode"><i class="icon-adjust"></i></a>
<a href="#" class="subCell toggle" id="changeColorPreset" title="Change color preset"><i class="icon-eye-open"></i></a>
</div>
<div id="audio">
<a href="#" class="subCell toggle" id="toggleAudio" title="Audio"><i class="icon-volume-up"></i></a>
@@ -35,7 +35,7 @@ var opts = {
'wasd': false, //Is the user in wasd mode?
'priorChatHeight': 0, //Thing for height-resizing detection
'restarting': false, //Is the round restarting?
'darkmode':false, //Are we using darkmode? If not WHY ARE YOU LIVING IN 2009???
'colorPreset': 0, // index in the color presets list.
//Options menu
'selectedSubLoop': null, //Contains the interval loop for closing the selected sub menu
@@ -73,6 +73,14 @@ var opts = {
};
// Array of names for chat display color presets.
// If not set to normal, a CSS file `browserOutput_${name}.css` will be added to the head.
var colorPresets = [
'normal',
'light',
'dark'
]
function clamp(val, min, max) {
return Math.max(min, Math.min(val, max))
}
@@ -96,6 +104,12 @@ if (typeof String.prototype.trim !== 'function') {
};
}
function updateColorPreset() {
var el = $("#colorPresetLink")[0];
el.href = "browserOutput_"+colorPresets[opts.colorPreset]+".css";
runByond('?_src_=chat&proc=colorPresetPost&preset='+colorPresets[opts.colorPreset]);
}
// Linkify the contents of a node, within its parent.
function linkify(parent, insertBefore, text) {
var start = 0;
@@ -395,19 +409,6 @@ function toHex(n) {
return "0123456789ABCDEF".charAt((n-n%16)/16) + "0123456789ABCDEF".charAt(n%16);
}
function swap() { //Swap to darkmode
if (opts.darkmode){
document.getElementById("sheetofstyles").href = "browserOutput_white.css";
opts.darkmode = false;
runByond('?_src_=chat&proc=swaptolightmode');
} else {
document.getElementById("sheetofstyles").href = "browserOutput.css";
opts.darkmode = true;
runByond('?_src_=chat&proc=swaptodarkmode');
}
setCookie('darkmode', (opts.darkmode ? 'true' : 'false'), 365);
}
function handleClientData(ckey, ip, compid) {
//byond sends player info to here
var currentData = {'ckey': ckey, 'ip': ip, 'compid': compid};
@@ -615,7 +616,7 @@ $(function() {
'shighlightColor': getCookie('highlightcolor'),
'smusicVolume': getCookie('musicVolume'),
'smessagecombining': getCookie('messagecombining'),
'sdarkmode': getCookie('darkmode'),
'scolorPreset': getCookie('colorpreset'),
};
if (savedConfig.sfontSize) {
@@ -626,9 +627,6 @@ $(function() {
$("body").css('line-height', savedConfig.slineHeight);
internalOutput('<span class="internal boldnshit">Loaded line height setting of: '+savedConfig.slineHeight+'</span>', 'internal');
}
if(savedConfig.sdarkmode == 'true'){
swap();
}
if (savedConfig.spingDisabled) {
if (savedConfig.spingDisabled == 'true') {
opts.pingDisabled = true;
@@ -654,6 +652,13 @@ $(function() {
opts.highlightColor = savedConfig.shighlightColor;
internalOutput('<span class="internal boldnshit">Loaded highlight color of: '+savedConfig.shighlightColor+'</span>', 'internal');
}
if (savedConfig.scolorPreset) {
opts.colorPreset = Number(savedConfig.scolorPreset);
updateColorPreset();
internalOutput('<span class="internal boldnshit">Loaded color preset of: '+colorPresets[opts.colorPreset]+'</span>', 'internal');
}
if (savedConfig.smusicVolume) {
var newVolume = clamp(savedConfig.smusicVolume, 0, 100);
$('#adminMusic').prop('volume', newVolume / 100);
@@ -839,9 +844,6 @@ $(function() {
$('#toggleOptions').click(function(e) {
handleToggleClick($subOptions, $(this));
});
$('#darkmodetoggle').click(function(e) {
swap();
});
$('#toggleAudio').click(function(e) {
handleToggleClick($subAudio, $(this));
});
@@ -913,7 +915,7 @@ $(function() {
$.ajax({
type: 'GET',
url: 'browserOutput_white.css',
url: 'browserOutput.css',
success: function(styleData) {
var blob = new Blob(['<head><title>Chat Log</title><style>', styleData, '</style></head><body>', $messages.html(), '</body>']);
@@ -992,6 +994,13 @@ $(function() {
opts.messageCount = 0;
});
$('#changeColorPreset').click(function() {
opts.colorPreset = (opts.colorPreset+1) % colorPresets.length;
updateColorPreset();
setCookie('colorpreset', opts.colorPreset, 365);
internalOutput('<span class="internal boldnshit">Changed color preset to: '+colorPresets[opts.colorPreset]);
});
$('#musicVolumeSpan').hover(function() {
$('#musicVolumeText').addClass('hidden');
$('#musicVolume').removeClass('hidden');
+59 -1
View File
@@ -37,7 +37,7 @@
species = "lily"
plantname = "Lily Plants"
product = /obj/item/reagent_containers/food/snacks/grown/poppy/lily
mutatelist = list()
mutatelist = list(/obj/item/seeds/bee_balm)
/obj/item/reagent_containers/food/snacks/grown/poppy/lily
seed = /obj/item/seeds/poppy/lily
@@ -221,3 +221,61 @@
if(!user.gloves)
to_chat(user, "<span class='danger'>The [name] burns your bare hand!</span>")
user.adjustFireLoss(rand(1, 5))
// Beebalm
/obj/item/seeds/bee_balm
name = "pack of Bee Balm seeds"
desc = "These seeds grow into Bee Balms."
icon_state = "seed-bee_balm"
species = "bee_balm"
plantname = "Bee Balm Buds"
product = /obj/item/reagent_containers/food/snacks/grown/bee_balm
endurance = 10
maturation = 8
yield = 3
potency = 30
growthstages = 3
growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi'
icon_grow = "bee_balm-grow"
icon_dead = "bee_balm-dead"
mutatelist = list(/obj/item/seeds/poppy/geranium, /obj/item/seeds/bee_balm/honey) //Lower odds of becoming honey
reagents_add = list("spaceacillin" = 0.1, "sterilizine" = 0.05)
/obj/item/reagent_containers/food/snacks/grown/bee_balm
seed = /obj/item/seeds/bee_balm
name = "bee balm"
desc = "A flower used for medical antiseptic in history."
icon_state = "bee_balm"
filling_color = "#FF6347"
bitesize_mod = 8
tastes = list("strong antiseptic " = 1)
foodtype = GROSS
// Beebalm
/obj/item/seeds/bee_balm/honey
name = "pack of Honey Balm seeds"
desc = "These seeds grow into Honey Balms."
icon_state = "seed-bee_balmalt"
species = "seed-bee_balm_alt"
plantname = "Honey Balm Pods"
product = /obj/item/reagent_containers/food/snacks/grown/bee_balm/honey
endurance = 1
maturation = 10
yield = 1
potency = 1
growthstages = 3
growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi'
icon_grow = "bee_balmalt-grow"
icon_dead = "bee_balmalt-dead"
reagents_add = list("honey" = 0.1, "lye" = 0.3) //To make wax
rarity = 30
/obj/item/reagent_containers/food/snacks/grown/bee_balm/honey
seed = /obj/item/seeds/bee_balm/honey
name = "honey balm"
desc = "A large honey filled pod of a flower."
icon_state = "bee_balmalt"
filling_color = "#FF6347"
bitesize_mod = 8
tastes = list("wax" = 1)
foodtype = SUGAR
+3 -2
View File
@@ -1,7 +1,7 @@
// Starthistle
/obj/item/seeds/starthistle
name = "pack of starthistle seeds"
desc = "A robust species of weed that often springs up in-between the cracks of spaceship parking lots."
desc = "A robust species of weed that often springs up in-between the cracks of spaceship parking lots. Grind down these seeds for a substitution for mustardgrind."
icon_state = "seed-starthistle"
species = "starthistle"
plantname = "Starthistle"
@@ -9,9 +9,10 @@
endurance = 50 // damm pesky weeds
maturation = 5
production = 1
yield = 2
yield = 6
potency = 10
growthstages = 3
grind_results = list("mustardgrind" = 1)
growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi'
genes = list(/datum/plant_gene/trait/plant_type/weed_hardy)
mutatelist = list(/obj/item/seeds/harebell)
+1 -1
View File
@@ -63,4 +63,4 @@
mask = /obj/item/clothing/mask/gas/sechailer
suit = /obj/item/clothing/suit/space/hardsuit/captain
suit_store = /obj/item/tank/internals/oxygen
suit_store = /obj/item/tank/internals/oxygen
+2 -2
View File
@@ -72,7 +72,7 @@
B.name = "Fluorescent Incandescence"
if("lol", "wtf", "gay", "penis", "ass", "poo", "badmin", "shitmin", "deadmin", "cock", "cocks", "meme", "memes")
B.name = pick("Woodys Got Wood: The Aftermath", "War of the Cocks", "Sweet Bro and Hella Jef: Expanded Edition","F.A.T.A.L. Rulebook")
H.adjustBrainLoss(100) // starts off retarded as fuck
H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 100) // starts off retarded as fuck
if("monkeyism","apism","gorillism","primatism")
B.name = pick("Going Bananas", "Bananas Out For Harambe")
if("mormonism")
@@ -118,4 +118,4 @@
uniform = /obj/item/clothing/under/rank/chaplain
backpack_contents = list(/obj/item/camera/spooky = 1)
backpack = /obj/item/storage/backpack/cultpack
satchel = /obj/item/storage/backpack/cultpack
satchel = /obj/item/storage/backpack/cultpack
+2 -2
View File
@@ -50,8 +50,8 @@
if(U.job in list("Curator")) // the curator is both faster, and more accurate than normal crew members at research
speed = 100
correctness = 100
correctness -= U.getBrainLoss() *0.5 //Brain damage makes researching hard.
speed += U.getBrainLoss() * 3
correctness -= U.getOrganLoss(ORGAN_SLOT_BRAIN) *0.5 //Brain damage makes researching hard.
speed += U.getOrganLoss(ORGAN_SLOT_BRAIN) * 3
if(do_after(user, speed, 0, user))
var/usedName = devilName
if(!prob(correctness))
+1 -1
View File
@@ -213,4 +213,4 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava)
if(!ispath(disease_type,/datum/disease))
CRASH("Wrong disease type passed in.")
var/datum/disease/D = new disease_type()
return list(component_type,D)
return list(component_type,D)
+9
View File
@@ -169,6 +169,7 @@
locked = FALSE
cut_overlays()
add_overlay("securecrateg")
tamperproof = 0 // set explosion chance to zero, so we dont accidently hit it with a multitool and instantly die
else if (input == null || sanitycheck == null || length(input) != codelen)
to_chat(user, "<span class='notice'>You leave the crate alone.</span>")
else
@@ -213,6 +214,12 @@
return
return ..()
/obj/structure/closet/secure/loot/dive_into(mob/living/user)
if(!locked)
return ..()
to_chat(user, "<span class='notice'>That seems like a stupid idea.</span>")
return FALSE
/obj/structure/closet/crate/secure/loot/emag_act(mob/user)
. = SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
if(!locked)
@@ -227,4 +234,6 @@
..()
/obj/structure/closet/crate/secure/loot/deconstruct(disassembled = TRUE)
if(!locked && disassembled)
return ..()
boom()
@@ -1,50 +1,51 @@
/*********************Mining Hammer****************/
/obj/item/twohanded/required/kinetic_crusher
/obj/item/twohanded/kinetic_crusher
icon = 'icons/obj/mining.dmi'
icon_state = "mining_hammer1"
item_state = "mining_hammer1"
icon_state = "crusher"
item_state = "crusher0"
lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi'
name = "proto-kinetic crusher"
desc = "An early design of the proto-kinetic accelerator, it is little more than an combination of various mining tools cobbled together, forming a high-tech club. \
While it is an effective mining tool, it did little to aid any but the most skilled and/or suicidal miners against local fauna."
force = 20 //As much as a bone spear, but this is significantly more annoying to carry around due to requiring the use of both hands at all times
force = 0 //You can't hit stuff unless wielded
w_class = WEIGHT_CLASS_BULKY
slot_flags = ITEM_SLOT_BACK
force_unwielded = 20 //It's never not wielded so these are the same
force_unwielded = 0
force_wielded = 20
throwforce = 5
throw_speed = 4
light_range = 7
light_power = 2
armour_penetration = 10
materials = list(MAT_METAL=1150, MAT_GLASS=2075)
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("smashed", "crushed", "cleaved", "chopped", "pulped")
sharpness = IS_SHARP
actions_types = list(/datum/action/item_action/toggle_light)
var/list/trophies = list()
var/charged = TRUE
var/charge_time = 15
var/detonation_damage = 50
var/backstab_bonus = 30
var/light_on = FALSE
var/brightness_on = 7
/obj/item/twohanded/required/kinetic_crusher/Initialize()
/obj/item/twohanded/kinetic_crusher/Initialize()
. = ..()
AddComponent(/datum/component/butchering, 60, 110) //technically it's huge and bulky, but this provides an incentive to use it
/obj/item/twohanded/required/kinetic_crusher/Destroy()
/obj/item/twohanded/kinetic_crusher/Destroy()
QDEL_LIST(trophies)
return ..()
/obj/item/twohanded/required/kinetic_crusher/examine(mob/living/user)
/obj/item/twohanded/kinetic_crusher/examine(mob/living/user)
..()
to_chat(user, "<span class='notice'>Mark a large creature with the destabilizing force, then hit them in melee to do <b>[force + detonation_damage]</b> damage.</span>")
to_chat(user, "<span class='notice'>Does <b>[force + detonation_damage + backstab_bonus]</b> damage if the target is backstabbed, instead of <b>[force + detonation_damage]</b>.</span>")
to_chat(user, "<span class='notice'>Mark a large creature with the destabilizing force, then hit them in melee to do <b>[force_wielded + detonation_damage]</b> damage.</span>")
to_chat(user, "<span class='notice'>Does <b>[force_wielded + detonation_damage + backstab_bonus]</b> damage if the target is backstabbed, instead of <b>[force_wielded + detonation_damage]</b>.</span>")
for(var/t in trophies)
var/obj/item/crusher_trophy/T = t
to_chat(user, "<span class='notice'>It has \a [T] attached, which causes [T.effect_desc()].</span>")
/obj/item/twohanded/required/kinetic_crusher/attackby(obj/item/I, mob/living/user)
/obj/item/twohanded/kinetic_crusher/attackby(obj/item/I, mob/living/user)
if(istype(I, /obj/item/crowbar))
if(LAZYLEN(trophies))
to_chat(user, "<span class='notice'>You remove [src]'s trophies.</span>")
@@ -60,7 +61,11 @@
else
return ..()
/obj/item/twohanded/required/kinetic_crusher/attack(mob/living/target, mob/living/carbon/user)
/obj/item/twohanded/kinetic_crusher/attack(mob/living/target, mob/living/carbon/user)
if(!wielded)
to_chat(user, "<span class='warning'>[src] is too heavy to use with one hand. You fumble and drop everything.")
user.drop_all_held_items()
return
var/datum/status_effect/crusher_damage/C = target.has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
var/target_health = target.health
..()
@@ -71,11 +76,13 @@
if(!QDELETED(C) && !QDELETED(target))
C.total_damage += target_health - target.health //we did some damage, but let's not assume how much we did
/obj/item/twohanded/required/kinetic_crusher/afterattack(atom/target, mob/living/user, proximity_flag, clickparams)
/obj/item/twohanded/kinetic_crusher/afterattack(atom/target, mob/living/user, proximity_flag, clickparams)
. = ..()
if(istype(target, /obj/item/crusher_trophy))
var/obj/item/crusher_trophy/T = target
T.add_to(src, user)
if(!wielded)
return
if(!proximity_flag && charged)//Mark a target, or mine a tile.
var/turf/proj_turf = user.loc
if(!isturf(proj_turf))
@@ -90,7 +97,7 @@
playsound(user, 'sound/weapons/plasma_cutter.ogg', 100, 1)
D.fire()
charged = FALSE
icon_state = "mining_hammer1_uncharged"
update_icon()
addtimer(CALLBACK(src, .proc/Recharge), charge_time)
return
if(proximity_flag && isliving(target))
@@ -122,12 +129,37 @@
if(user && lavaland_equipment_pressure_check(get_turf(user))) //CIT CHANGE - makes sure below only happens in low pressure environments
user.adjustStaminaLoss(-30)//CIT CHANGE - makes crushers heal stamina
/obj/item/twohanded/required/kinetic_crusher/proc/Recharge()
/obj/item/twohanded/kinetic_crusher/proc/Recharge()
if(!charged)
charged = TRUE
icon_state = "mining_hammer1"
update_icon()
playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
/obj/item/twohanded/kinetic_crusher/ui_action_click(mob/user, actiontype)
light_on = !light_on
playsound(user, 'sound/weapons/empty.ogg', 100, TRUE)
update_brightness(user)
update_icon()
/obj/item/twohanded/kinetic_crusher/proc/update_brightness(mob/user = null)
if(light_on)
set_light(brightness_on)
else
set_light(0)
/obj/item/twohanded/kinetic_crusher/update_icon()
..()
cut_overlays()
if(!charged)
add_overlay("[icon_state]_uncharged")
if(light_on)
add_overlay("[icon_state]_lit")
spawn(1)
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()
item_state = "crusher[wielded]"
//destablizing force
/obj/item/projectile/destabilizer
name = "destabilizing force"
@@ -138,7 +170,7 @@
flag = "bomb"
range = 6
log_override = TRUE
var/obj/item/twohanded/required/kinetic_crusher/hammer_synced
var/obj/item/twohanded/kinetic_crusher/hammer_synced
/obj/item/projectile/destabilizer/Destroy()
hammer_synced = null
@@ -177,12 +209,12 @@
return "errors"
/obj/item/crusher_trophy/attackby(obj/item/A, mob/living/user)
if(istype(A, /obj/item/twohanded/required/kinetic_crusher))
if(istype(A, /obj/item/twohanded/kinetic_crusher))
add_to(A, user)
else
..()
/obj/item/crusher_trophy/proc/add_to(obj/item/twohanded/required/kinetic_crusher/H, mob/living/user)
/obj/item/crusher_trophy/proc/add_to(obj/item/twohanded/kinetic_crusher/H, mob/living/user)
for(var/t in H.trophies)
var/obj/item/crusher_trophy/T = t
if(istype(T, denied_type) || istype(src, T.denied_type))
@@ -194,7 +226,7 @@
to_chat(user, "<span class='notice'>You attach [src] to [H].</span>")
return TRUE
/obj/item/crusher_trophy/proc/remove_from(obj/item/twohanded/required/kinetic_crusher/H, mob/living/user)
/obj/item/crusher_trophy/proc/remove_from(obj/item/twohanded/kinetic_crusher/H, mob/living/user)
forceMove(get_turf(H))
H.trophies -= src
return TRUE
@@ -281,12 +313,12 @@
/obj/item/crusher_trophy/legion_skull/effect_desc()
return "a kinetic crusher to recharge <b>[bonus_value*0.1]</b> second\s faster"
/obj/item/crusher_trophy/legion_skull/add_to(obj/item/twohanded/required/kinetic_crusher/H, mob/living/user)
/obj/item/crusher_trophy/legion_skull/add_to(obj/item/twohanded/kinetic_crusher/H, mob/living/user)
. = ..()
if(.)
H.charge_time -= bonus_value
/obj/item/crusher_trophy/legion_skull/remove_from(obj/item/twohanded/required/kinetic_crusher/H, mob/living/user)
/obj/item/crusher_trophy/legion_skull/remove_from(obj/item/twohanded/kinetic_crusher/H, mob/living/user)
. = ..()
if(.)
H.charge_time += bonus_value
@@ -339,7 +371,7 @@
/obj/item/crusher_trophy/demon_claws/effect_desc()
return "melee hits to do <b>[bonus_value * 0.2]</b> more damage and heal you for <b>[bonus_value * 0.1]</b>, with <b>5X</b> effect on mark detonation"
/obj/item/crusher_trophy/demon_claws/add_to(obj/item/twohanded/required/kinetic_crusher/H, mob/living/user)
/obj/item/crusher_trophy/demon_claws/add_to(obj/item/twohanded/kinetic_crusher/H, mob/living/user)
. = ..()
if(.)
H.force += bonus_value * 0.2
@@ -347,7 +379,7 @@
H.force_wielded += bonus_value * 0.2
H.detonation_damage += bonus_value * 0.8
/obj/item/crusher_trophy/demon_claws/remove_from(obj/item/twohanded/required/kinetic_crusher/H, mob/living/user)
/obj/item/crusher_trophy/demon_claws/remove_from(obj/item/twohanded/kinetic_crusher/H, mob/living/user)
. = ..()
if(.)
H.force -= bonus_value * 0.2
+2 -2
View File
@@ -30,7 +30,7 @@
new /datum/data/mining_equipment("500 Point Transfer Card", /obj/item/card/mining_point_card/mp500, 500),
new /datum/data/mining_equipment("Tracking Implant Kit", /obj/item/storage/box/minertracker, 600),
new /datum/data/mining_equipment("Jaunter", /obj/item/wormhole_jaunter, 750),
new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/twohanded/required/kinetic_crusher, 750),
new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/twohanded/kinetic_crusher, 750),
new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/gun/energy/kinetic_accelerator, 750),
new /datum/data/mining_equipment("Survival Medipen", /obj/item/reagent_containers/hypospray/medipen/survival, 750),
new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/storage/firstaid/brute, 800),
@@ -172,7 +172,7 @@
new /obj/item/stack/marker_beacon/thirty(drop_location)
if("Crusher Kit")
new /obj/item/extinguisher/mini(drop_location)
new /obj/item/twohanded/required/kinetic_crusher(drop_location)
new /obj/item/twohanded/kinetic_crusher(drop_location)
if("Mining Conscription Kit")
new /obj/item/storage/backpack/duffelbag/mining_conscript(drop_location)
+1 -1
View File
@@ -49,7 +49,7 @@
toggle_mode_action.Grant(src)
var/datum/action/innate/minedrone/dump_ore/dump_ore_action = new()
dump_ore_action.Grant(src)
var/obj/item/implant/radio/mining/imp = new(src)
var/obj/item/implant/radio/mining/imp = new
imp.implant(src)
access_card = new /obj/item/card/id(src)
+3
View File
@@ -30,5 +30,8 @@
loc = destination
Moved(oldloc, NONE, TRUE)
/mob/camera/canUseStorage()
return FALSE
/mob/camera/emote(act, m_type=1, message = null, intentional = FALSE)
return
+3
View File
@@ -20,6 +20,9 @@ INITIALIZE_IMMEDIATE(/mob/dead)
set_focus(src)
return INITIALIZE_HINT_NORMAL
/mob/dead/canUseStorage()
return FALSE
/mob/dead/dust(just_ash, drop_items, force) //ghosts can't be vaporised.
return
File diff suppressed because it is too large Load Diff
@@ -558,7 +558,7 @@
/datum/sprite_accessory/mam_tails_animated/horse
name = "Horse"
icon_state = "Horse"
icon_state = "horse"
color_src = HAIR
/datum/sprite_accessory/mam_tails/husky
+18 -12
View File
@@ -260,16 +260,16 @@ Transfer_mind is there to check if mob is being deleted/not going to have a body
Works together with spawning an observer, noted above.
*/
/mob/proc/ghostize(can_reenter_corpse = 1)
if(key)
if(!cmptext(copytext(key,1,2),"@")) // Skip aghosts.
stop_sound_channel(CHANNEL_HEARTBEAT) //Stop heartbeat sounds because You Are A Ghost Now
var/mob/dead/observer/ghost = new(src) // Transfer safety to observer spawning proc.
SStgui.on_transfer(src, ghost) // Transfer NanoUIs.
ghost.can_reenter_corpse = can_reenter_corpse
ghost.can_reenter_round = (can_reenter_corpse && !suiciding)
ghost.key = key
return ghost
/mob/proc/ghostize(can_reenter_corpse = TRUE, special = FALSE)
if(!key || cmptext(copytext(key,1,2),"@") || (!special && SEND_SIGNAL(src, COMSIG_MOB_GHOSTIZE, can_reenter_corpse, special) & COMPONENT_BLOCK_GHOSTING))
return //mob has no key, is an aghost or some component hijacked.
stop_sound_channel(CHANNEL_HEARTBEAT) //Stop heartbeat sounds because You Are A Ghost Now
var/mob/dead/observer/ghost = new(src) // Transfer safety to observer spawning proc.
SStgui.on_transfer(src, ghost) // Transfer NanoUIs.
ghost.can_reenter_corpse = can_reenter_corpse
ghost.can_reenter_round = (can_reenter_corpse && !suiciding)
transfer_ckey(ghost, FALSE)
return ghost
/*
This is the proc mobs get to turn into a ghost. Forked from ghostize due to compatibility issues.
@@ -280,6 +280,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
set name = "Ghost"
set desc = "Relinquish your life and enter the land of the dead."
if(SEND_SIGNAL(src, COMSIG_MOB_GHOSTIZE, (stat == DEAD) ? TRUE : FALSE, FALSE) & COMPONENT_BLOCK_GHOSTING)
return
// CITADEL EDIT
if(istype(loc, /obj/machinery/cryopod))
var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you won't be able to re-enter this round! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body")
@@ -306,6 +309,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
set name = "Ghost"
set desc = "Relinquish your life and enter the land of the dead."
if(SEND_SIGNAL(src, COMSIG_MOB_GHOSTIZE, FALSE, FALSE) & COMPONENT_BLOCK_GHOSTING)
return
var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you won't be able to re-enter this round! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body")
if(response != "Ghost")
return
@@ -348,7 +354,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
return
client.change_view(CONFIG_GET(string/default_view))
SStgui.on_transfer(src, mind.current) // Transfer NanoUIs.
mind.current.key = key
transfer_ckey(mind.current, FALSE)
return 1
/mob/dead/observer/proc/notify_cloning(var/message, var/sound, var/atom/source, flashwindow = TRUE)
@@ -628,7 +634,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
to_chat(src, "<span class='warning'>Someone has taken this body while you were choosing!</span>")
return 0
target.key = key
transfer_ckey(target, FALSE)
target.faction = list("neutral")
return 1
+1 -1
View File
@@ -158,7 +158,7 @@
//Returns if a certain item can be equipped to a certain slot.
// Currently invalid for two-handed items - call obj/item/mob_can_equip() instead.
/mob/proc/can_equip(obj/item/I, slot, disable_warning = 0)
/mob/proc/can_equip(obj/item/I, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE)
return FALSE
/mob/proc/can_put_in_hand(I, hand_index)

Some files were not shown because too many files have changed in this diff Show More