Merge pull request #48 from Citadel-Station-13/master

updater
This commit is contained in:
Trilbyspaceclone
2019-05-29 18:00:25 -04:00
committed by GitHub
37 changed files with 333 additions and 169 deletions
@@ -46022,6 +46022,9 @@
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/delivery,
/obj/machinery/shower{
dir = 4
},
/turf/open/floor/plasteel,
/area/engine/engineering)
"cek" = (
@@ -46030,6 +46033,9 @@
name = "engineering security door"
},
/obj/effect/turf_decal/delivery,
/obj/machinery/shower{
dir = 8
},
/turf/open/floor/plasteel,
/area/engine/engineering)
"cel" = (
+10 -3
View File
@@ -44325,7 +44325,9 @@
dir = 1;
pixel_y = -22
},
/obj/structure/closet/radiation,
/obj/machinery/shower{
dir = 4
},
/turf/open/floor/plasteel,
/area/engine/break_room)
"bWF" = (
@@ -44352,7 +44354,10 @@
dir = 6
},
/obj/effect/turf_decal/delivery,
/obj/structure/closet/radiation,
/obj/machinery/shower{
dir = 8;
pixel_y = -4
},
/turf/open/floor/plasteel,
/area/engine/break_room)
"bWH" = (
@@ -44932,6 +44937,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 1
},
/obj/structure/closet/radiation,
/turf/open/floor/plasteel,
/area/engine/engineering)
"bYn" = (
@@ -44956,6 +44962,7 @@
/obj/machinery/light{
dir = 4
},
/obj/structure/closet/radiation,
/turf/open/floor/plasteel,
/area/engine/engineering)
"bYp" = (
@@ -53780,7 +53787,7 @@
"eSB" = (
/obj/machinery/computer/cryopod{
dir = 1;
pixel_y = -26;
pixel_y = -26
},
/turf/open/floor/plasteel/dark,
/area/security/prison)
+2 -2
View File
@@ -294,7 +294,7 @@ GLOBAL_LIST_EMPTY(species_list)
else
return "unknown"
/proc/do_mob(mob/user , mob/target, time = 30, uninterruptible = 0, progress = 1, datum/callback/extra_checks = null)
/proc/do_mob(mob/user , mob/target, time = 30, uninterruptible = 0, progress = 1, datum/callback/extra_checks = null, ignorehelditem = 0)
if(!user || !target)
return 0
var/user_loc = user.loc
@@ -327,7 +327,7 @@ GLOBAL_LIST_EMPTY(species_list)
drifting = 0
user_loc = user.loc
if((!drifting && user.loc != user_loc) || target.loc != target_loc || user.get_active_held_item() != holding || user.incapacitated() || user.lying || (extra_checks && !extra_checks.Invoke()))
if((!drifting && user.loc != user_loc) || target.loc != target_loc || (!ignorehelditem && user.get_active_held_item() != holding) || user.incapacitated() || user.lying || (extra_checks && !extra_checks.Invoke()))
. = 0
break
if (progress)
+2
View File
@@ -94,6 +94,8 @@
// Used to get a properly sanitized multiline input, of max_length
/proc/stripped_multiline_input(mob/user, message = "", title = "", default = "", max_length=MAX_MESSAGE_LEN, no_trim=FALSE)
var/name = input(user, message, title, default) as message|null
if(isnull(name)) // Return null if canceled.
return null
if(no_trim)
return copytext(html_encode(name), 1, max_length)
else
+20 -5
View File
@@ -103,7 +103,9 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new)
if(data_by_z["[z]"] && last_update["[z]"] && world.time <= last_update["[z]"] + SENSORS_UPDATE_PERIOD)
return data_by_z["[z]"]
var/list/results = list()
var/list/results_damaged = list()
var/list/results_undamaged = list()
var/obj/item/clothing/under/U
var/obj/item/card/id/I
var/turf/pos
@@ -114,6 +116,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new)
var/toxdam
var/burndam
var/brutedam
var/totaldam
var/area
var/pos_x
var/pos_y
@@ -157,11 +160,13 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new)
toxdam = round(H.getToxLoss(),1)
burndam = round(H.getFireLoss(),1)
brutedam = round(H.getBruteLoss(),1)
totaldam = oxydam + toxdam + burndam + brutedam
else
oxydam = null
toxdam = null
burndam = null
brutedam = null
totaldam = 0
if (nanite_sensors || U.sensor_mode >= SENSOR_COORDS)
if (!pos)
@@ -174,16 +179,26 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new)
pos_x = null
pos_y = null
results[++results.len] = list("name" = name, "assignment" = assignment, "ijob" = ijob, "life_status" = life_status, "oxydam" = oxydam, "toxdam" = toxdam, "burndam" = burndam, "brutedam" = brutedam, "area" = area, "pos_x" = pos_x, "pos_y" = pos_y, "can_track" = H.can_track(null))
var/total_list = list("name" = name, "assignment" = assignment, "ijob" = ijob, "life_status" = life_status, "oxydam" = oxydam, "toxdam" = toxdam, "burndam" = burndam, "brutedam" = brutedam, "totaldam" = totaldam, "area" = area, "pos_x" = pos_x, "pos_y" = pos_y, "can_track" = H.can_track(null))
data_by_z["[z]"] = sortTim(results,/proc/sensor_compare)
if(totaldam)
results_damaged[++results_damaged.len] = total_list
else
results_undamaged[++results_undamaged.len] = total_list
var/list/returning = sortTim(results_damaged,/proc/damage_compare) + sortTim(results_undamaged,/proc/ijob_compare)
data_by_z["[z]"] = returning
last_update["[z]"] = world.time
return results
return returning
/proc/sensor_compare(list/a,list/b)
/proc/ijob_compare(list/a,list/b)
return a["ijob"] - b["ijob"]
/proc/damage_compare(list/a,list/b)
return b["totaldam"] - a["totaldam"]
/datum/crewmonitor/ui_act(action,params)
var/mob/living/silicon/ai/AI = usr
if(!istype(AI))
@@ -252,7 +252,8 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \
new/datum/stack_recipe("bedsheet", /obj/item/bedsheet, 3), \
new/datum/stack_recipe("empty sandbag", /obj/item/emptysandbag, 4), \
null, \
new/datum/stack_recipe("fingerless gloves", /obj/item/clothing/gloves/fingerless, 1), \
new/datum/stack_recipe("fingerless gloves", /obj/item/clothing/gloves/fingerless, 1),\
new/datum/stack_recipe("white gloves", /obj/item/clothing/gloves/color/white, 1),\
new/datum/stack_recipe("black gloves", /obj/item/clothing/gloves/color/black, 3), \
null, \
new/datum/stack_recipe("blindfold", /obj/item/clothing/glasses/sunglasses/blindfold, 2), \
@@ -284,6 +285,13 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \
new/datum/stack_recipe("light tubes", /obj/item/storage/box/lights/tubes), \
new/datum/stack_recipe("light bulbs", /obj/item/storage/box/lights/bulbs), \
new/datum/stack_recipe("mouse traps", /obj/item/storage/box/mousetraps), \
new/datum/stack_recipe("lethal ammo box", /obj/item/storage/box/lethalshot), \
new/datum/stack_recipe("rubber shot ammo box", /obj/item/storage/box/rubbershot), \
new/datum/stack_recipe("bean bag ammo box", /obj/item/storage/box/beanbag), \
new/datum/stack_recipe("12g ammo box", /obj/item/storage/box/lethalslugs), \
new/datum/stack_recipe("stun slug ammo box", /obj/item/storage/box/stunslug), \
new/datum/stack_recipe("tech shell ammo box", /obj/item/storage/box/techsslug), \
new/datum/stack_recipe("incendiary ammo box", /obj/item/storage/box/fireshot), \
new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/cardborg, 3), \
new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg), \
new/datum/stack_recipe("pizza box", /obj/item/pizzabox), \
+43 -6
View File
@@ -14,8 +14,9 @@
* ID and security PDA cart boxes,
* Handcuff, mousetrap, and pillbottle boxes,
* Snap-pops and matchboxes,
* Replacement light boxes.
* Action Figure Boxes
* Replacement light boxes,
* Shotgun Ammo boxes,
* Action Figure Boxes,
* Various paper bags.
*
* For syndicate call-ins see uplink_kits.dm
@@ -84,7 +85,6 @@
for(var/i in 1 to 7)
new /obj/item/disk/data(src)
/obj/item/storage/box/disks_plantgene
name = "plant data disks box"
illustration = "disk_kit"
@@ -117,7 +117,6 @@
new /obj/item/crowbar/red(src)
new /obj/item/reagent_containers/hypospray/medipen(src)
// Engineer survival box
/obj/item/storage/box/engineer/PopulateContents()
new /obj/item/clothing/mask/breath(src)
@@ -261,7 +260,6 @@
new /obj/item/assembly/flash/handheld(src)
new /obj/item/screwdriver(src)
/obj/item/storage/box/teargas
name = "box of tear gas grenades (WARNING)"
desc = "<B>WARNING: These devices are extremely dangerous and can cause blindness and skin irritation.</B>"
@@ -615,7 +613,6 @@
for(var/i in 1 to 7)
new /obj/item/light/bulb(src)
/obj/item/storage/box/deputy
name = "box of deputy armbands"
desc = "To be issued to those authorized to act as deputy of security."
@@ -721,6 +718,46 @@
for(var/i in 1 to 6)
new /obj/item/ammo_casing/shotgun/beanbag(src)
/obj/item/storage/box/lethalslugs
name = "box of 12g shotgun slugs"
desc = "A box full of lethal 12g slug, designed for riot shotguns."
icon_state = "12g_box"
illustration = null
/obj/item/storage/box/lethalslugs/PopulateContents()
for(var/i in 1 to 7)
new /obj/item/projectile/bullet/shotgun_slug(src)
/obj/item/storage/box/stunslug
name = "box of stun slugs"
desc = "A box full of stun 12g slugs."
icon_state = "stunslug_box"
illustration = null
/obj/item/storage/box/stunslug/PopulateContents()
for(var/i in 1 to 7)
new /obj/item/projectile/bullet/shotgun_stunslug(src)
/obj/item/storage/box/techsslug
name = "box of tech shotgun shells"
desc = "A box full of tech shotgun shells."
icon_state = "techslug_box"
illustration = null
/obj/item/storage/box/techsslug/PopulateContents()
for(var/i in 1 to 7)
new /obj/item/ammo_casing/shotgun/techshell(src)
/obj/item/storage/box/fireshot
name = "box of incendiary ammo"
desc = "A box full of tech incendiary ammo."
icon_state = "fireshot_box"
illustration = null
/obj/item/storage/box/techsslug/PopulateContents()
for(var/i in 1 to 7)
new /obj/item/ammo_casing/shotgun/incendiary(src)
/obj/item/storage/box/actionfigure
name = "box of action figures"
desc = "The latest set of collectable action figures."
+53 -30
View File
@@ -1,3 +1,5 @@
#define STUNBATON_CHARGE_LENIENCY 0.3
/obj/item/melee/baton
name = "stunbaton"
desc = "A stun baton for incapacitating people with."
@@ -13,7 +15,7 @@
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80)
var/stunforce = 140
var/status = 0
var/status = FALSE
var/obj/item/stock_parts/cell/cell
var/hitcost = 1000
var/throw_hit_chance = 35
@@ -44,17 +46,31 @@
/obj/item/melee/baton/loaded //this one starts with a cell pre-installed.
preload_cell_type = /obj/item/stock_parts/cell/high
/obj/item/melee/baton/proc/deductcharge(chrgdeductamt)
if(cell)
//Note this value returned is significant, as it will determine
//if a stun is applied or not
. = cell.use(chrgdeductamt)
if(status && cell.charge < hitcost)
//we're below minimum, turn off
status = 0
update_icon()
playsound(loc, "sparks", 75, 1, -1)
/obj/item/melee/baton/proc/deductcharge(chrgdeductamt, chargecheck = TRUE)
if(!cell)
switch_status(FALSE, TRUE)
return FALSE
//Note this value returned is significant, as it will determine
//if a stun is applied or not
. = cell.use(chrgdeductamt)
if(status && (!. || (chargecheck && cell.charge < hitcost * STUNBATON_CHARGE_LENIENCY)))
//we're below minimum, turn off
switch_status(FALSE)
/obj/item/melee/baton/proc/switch_status(new_status = FALSE, silent = FALSE)
if(status == new_status)
return
status = new_status
update_icon()
if(!silent)
playsound(loc, "sparks", 75, 1, -1)
if(status)
START_PROCESSING(SSobj, src)
else
STOP_PROCESSING(SSobj, src)
/obj/item/melee/baton/process()
deductcharge(hitcost * 0.004, FALSE)
/obj/item/melee/baton/update_icon()
if(status)
@@ -92,31 +108,25 @@
cell.forceMove(get_turf(src))
cell = null
to_chat(user, "<span class='notice'>You remove the cell from [src].</span>")
status = 0
update_icon()
switch_status(FALSE, TRUE)
else
return ..()
/obj/item/melee/baton/attack_self(mob/user)
if(cell && cell.charge > hitcost)
status = !status
if(cell && cell.charge > hitcost * STUNBATON_CHARGE_LENIENCY)
switch_status(!status)
to_chat(user, "<span class='notice'>[src] is now [status ? "on" : "off"].</span>")
playsound(loc, "sparks", 75, 1, -1)
else
status = 0
switch_status(FALSE, TRUE)
if(!cell)
to_chat(user, "<span class='warning'>[src] does not have a power source!</span>")
else
to_chat(user, "<span class='warning'>[src] is out of charge.</span>")
update_icon()
add_fingerprint(user)
/obj/item/melee/baton/attack(mob/M, mob/living/carbon/human/user)
if(status && user.has_trait(TRAIT_CLUMSY) && prob(50))
user.visible_message("<span class='danger'>[user] accidentally hits [user.p_them()]self with [src]!</span>", \
"<span class='userdanger'>You accidentally hit yourself with [src]!</span>")
user.Knockdown(stunforce*3)
deductcharge(hitcost)
clowning_around(user)
return
if(user.getStaminaLoss() >= STAMINA_SOFTCRIT)//CIT CHANGE - makes it impossible to baton in stamina softcrit
@@ -153,17 +163,21 @@
var/mob/living/carbon/human/H = L
if(H.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK)) //No message; check_shields() handles that
playsound(L, 'sound/weapons/genhit.ogg', 50, 1)
return 0
return FALSE
var/stunpwr = stunforce
if(iscyborg(loc))
var/mob/living/silicon/robot/R = loc
if(!R || !R.cell || !R.cell.use(hitcost))
return 0
if(!istype(R) || !R.cell || !R.cell.use(hitcost))
return FALSE
else
if(!deductcharge(hitcost))
return 0
var/stuncharge = cell.charge
if(!deductcharge(hitcost, FALSE))
stunpwr *= round(stuncharge/hitcost)
if(stunpwr < stunforce * STUNBATON_CHARGE_LENIENCY)
return FALSE
L.Knockdown(stunforce)
L.adjustStaminaLoss(stunforce*0.1, affected_zone = (istype(user) ? user.zone_selected : BODY_ZONE_CHEST))//CIT CHANGE - makes stunbatons deal extra staminaloss. Todo: make this also deal pain when pain gets implemented.
L.Knockdown(stunpwr)
L.adjustStaminaLoss(stunpwr*0.1, affected_zone = (istype(user) ? user.zone_selected : BODY_ZONE_CHEST))//CIT CHANGE - makes stunbatons deal extra staminaloss. Todo: make this also deal pain when pain gets implemented.
L.apply_effect(EFFECT_STUTTER, stunforce)
SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK)
if(user)
@@ -180,11 +194,18 @@
H.forcesay(GLOB.hit_appends)
return 1
return TRUE
/obj/item/melee/baton/proc/clowning_around(mob/living/user)
user.visible_message("<span class='danger'>[user] accidentally hits [user.p_them()]self with [src]!</span>", \
"<span class='userdanger'>You accidentally hit yourself with [src]!</span>")
user.Knockdown(stunforce*3)
deductcharge(hitcost)
/obj/item/melee/baton/emp_act(severity)
. = ..()
if (!(. & EMP_PROTECT_SELF))
switch_status(FALSE)
deductcharge(1000 / severity)
//Makeshift stun baton. Replacement for stun gloves.
@@ -211,3 +232,5 @@
/obj/item/melee/baton/cattleprod/baton_stun()
if(sparkler.activate())
..()
#undef STUNBATON_CHARGE_LENIENCY
+15 -19
View File
@@ -6,27 +6,23 @@
item_state = "teleprod"
slot_flags = null
/obj/item/melee/baton/cattleprod/teleprod/attack(mob/living/carbon/M, mob/living/carbon/user)//handles making things teleport when hit
..()
if(status && user.has_trait(TRAIT_CLUMSY) && prob(50))
user.visible_message("<span class='danger'>[user] accidentally hits [user.p_them()]self with [src]!</span>", \
"<span class='userdanger'>You accidentally hit yourself with [src]!</span>")
if(do_teleport(user, get_turf(user), 50))//honk honk
SEND_SIGNAL(user, COMSIG_LIVING_MINOR_SHOCK)
user.Knockdown(stunforce*3)
deductcharge(hitcost)
else
SEND_SIGNAL(user, COMSIG_LIVING_MINOR_SHOCK)
user.Knockdown(stunforce*3)
deductcharge(hitcost/4)
/obj/item/melee/baton/cattleprod/teleprod/baton_stun(mob/living/carbon/M, mob/living/carbon/user)//handles making things teleport when hit
. = ..()
if(!. || !istype(M) || M.anchored)
return
else
if(status)
if(!istype(M) && M.anchored)
return .
else
SEND_SIGNAL(M, COMSIG_LIVING_MINOR_SHOCK)
do_teleport(M, get_turf(M), 15)
SEND_SIGNAL(M, COMSIG_LIVING_MINOR_SHOCK)
do_teleport(M, get_turf(M), 15)
/obj/item/melee/baton/cattleprod/teleprod/clowning_around(mob/living/user)
user.visible_message("<span class='danger'>[user] accidentally hits [user.p_them()]self with [src]!</span>", \
"<span class='userdanger'>You accidentally hit yourself with [src]!</span>")
SEND_SIGNAL(user, COMSIG_LIVING_MINOR_SHOCK)
user.Knockdown(stunforce*3)
if(do_teleport(user, get_turf(user), 50))
deductcharge(hitcost)
else
deductcharge(hitcost * 0.25)
/obj/item/melee/baton/cattleprod/attackby(obj/item/I, mob/user, params)//handles sticking a crystal onto a stunprod to make a teleprod
if(istype(I, /obj/item/stack/ore/bluespace_crystal))
+76 -32
View File
@@ -13,7 +13,7 @@
var/give_equipment = FALSE
var/datum/team/cult/cult_team
/datum/antagonist/cult/get_team()
return cult_team
@@ -115,7 +115,7 @@
cult_team.rise(current)
if(cult_team.cult_ascendent)
cult_team.ascend(current)
/datum/antagonist/cult/remove_innate_effects(mob/living/mob_override)
. = ..()
var/mob/living/current = owner.current
@@ -220,7 +220,7 @@
throwing.Remove(current)
current.update_action_buttons_icon()
current.remove_status_effect(/datum/status_effect/cult_master)
if(ishuman(current))
var/mob/living/carbon/human/H = current
H.eye_color = initial(H.eye_color)
@@ -241,7 +241,31 @@
var/reckoning_complete = FALSE
var/cult_risen = FALSE
var/cult_ascendent = FALSE
/datum/team/cult/New()
. = ..()
START_PROCESSING(SSprocessing, src)
/datum/team/cult/Destroy()
STOP_PROCESSING(SSprocessing, src)
return ..()
/datum/team/cult/process()
if(SSticker.current_state == GAME_STATE_FINISHED)
return
var/datum/objective/sacrifice/sac_objective = locate() in objectives
if(!sac_objective || sac_objective.check_completion())
return
var/datum/mind/sacrificial = sac_objective.get_target()
var/mob/living/sac_current = sacrificial.current
if(!sacrificial || !sac_current) //target is gone for good but not sacrified.
sort_sacrifice(TRUE)
return
if(QDELETED(sac_objective.target_current) || sac_objective.target_current != sac_current) //target is now a different mob (monkey, simple mob)
sac_objective.sac_image = sac_current.get_sac_image()
sac_objective.target_current = sac_current
sac_objective.update_explanation_text()
/datum/team/cult/proc/check_size()
if(cult_ascendent)
return
@@ -262,7 +286,7 @@
to_chat(B.current, "<span class='cultlarge'>The veil weakens as your cult grows, your eyes begin to glow...")
addtimer(CALLBACK(src, .proc/rise, B.current), 200)
cult_risen = TRUE
if(ratio > CULT_ASCENDENT && !cult_ascendent)
for(var/datum/mind/B in members)
if(B.current)
@@ -270,8 +294,8 @@
to_chat(B.current, "<span class='cultlarge'>Your cult is ascendent and the red harvest approaches - you cannot hide your true nature for much longer!!")
addtimer(CALLBACK(src, .proc/ascend, B.current), 200)
cult_ascendent = TRUE
/datum/team/cult/proc/rise(cultist)
if(ishuman(cultist))
var/mob/living/carbon/human/H = cultist
@@ -279,7 +303,7 @@
H.dna.update_ui_block(DNA_EYE_COLOR_BLOCK)
H.add_trait(CULT_EYES)
H.update_body()
/datum/team/cult/proc/ascend(cultist)
if(ishuman(cultist))
var/mob/living/carbon/human/H = cultist
@@ -289,48 +313,68 @@
/datum/team/cult/proc/setup_objectives()
//SAC OBJECTIVE , todo: move this to objective internals
sort_sacrifice()
//SUMMON OBJECTIVE
var/datum/objective/eldergod/summon_objective = new()
summon_objective.team = src
objectives += summon_objective
/datum/team/cult/proc/sort_sacrifice(replacement = FALSE)
var/list/target_candidates = list()
var/datum/objective/sacrifice/sac_objective = new
sac_objective.team = src
var/datum/objective/sacrifice/sac_objective = locate() in GLOB.objectives
if(!sac_objective)
sac_objective = new
sac_objective.team = src
for(var/mob/living/carbon/human/player in GLOB.player_list)
if(player.mind && !player.mind.has_antag_datum(/datum/antagonist/cult) && !is_convertable_to_cult(player) && player.stat != DEAD)
target_candidates += player.mind
if(target_candidates.len == 0)
if(!length(target_candidates))
message_admins("Cult Sacrifice: Could not find unconvertible target, checking for convertible target.")
for(var/mob/living/carbon/human/player in GLOB.player_list)
if(player.mind && !player.mind.has_antag_datum(/datum/antagonist/cult) && player.stat != DEAD)
target_candidates += player.mind
listclearnulls(target_candidates)
if(LAZYLEN(target_candidates))
sac_objective.target = pick(target_candidates)
sac_objective.update_explanation_text()
if(!LAZYLEN(target_candidates))
message_admins("Cult Sacrifice: Could not find unconvertible or convertible target. Proceeding to next stage!")
sac_objective.sacced = TRUE
return
var/datum/mind/new_target = pick(target_candidates)
if(replacement)
for(var/datum/mind/H in members)
if(H.current)
to_chat(H.current, "<span class='danger'>Nar'Sie</span> murmurs, <span class='cultlarge'>[sac_objective.target] is beyond your reach. Sacrifice [new_target] instead...</span></span>")
sac_objective.target = new_target
sac_objective.target_current = new_target.current
sac_objective.update_explanation_text()
var/datum/job/sacjob = SSjob.GetJob(sac_objective.target.assigned_role)
var/datum/preferences/sacface = sac_objective.target.current.client.prefs
var/icon/reshape = get_flat_human_icon(null, sacjob, sacface, list(SOUTH))
reshape.Shift(SOUTH, 4)
reshape.Shift(EAST, 1)
reshape.Crop(7,4,26,31)
reshape.Crop(-5,-3,26,30)
sac_objective.sac_image = reshape
sac_objective.sac_image = sac_objective.target_current.get_sac_image()
objectives += sac_objective
objectives += sac_objective
else
message_admins("Cult Sacrifice: Could not find unconvertible or convertible target. WELP!")
/mob/proc/get_sac_image()
var/icon/reshape = icon(icon, icon_state, SOUTH)
reshape.Shift(SOUTH, 4)
reshape.Shift(EAST, 1)
reshape.Crop(7,4,26,31)
reshape.Crop(-5,-3,26,30)
/mob/living/carbon/human/get_sac_image()
var/datum/job/sacjob = SSjob.GetJob(mind.assigned_role)
var/datum/preferences/sacface = client.prefs
var/icon/reshape = get_flat_human_icon(null, sacjob, sacface, list(SOUTH))
reshape.Shift(SOUTH, 4)
reshape.Shift(EAST, 1)
reshape.Crop(7,4,26,31)
reshape.Crop(-5,-3,26,30)
//SUMMON OBJECTIVE
var/datum/objective/eldergod/summon_objective = new()
summon_objective.team = src
objectives += summon_objective
/datum/objective/sacrifice
var/sacced = FALSE
var/sac_image
var/mob/living/target_current
/datum/objective/sacrifice/check_completion()
return sacced || completed
+1 -1
View File
@@ -246,7 +246,7 @@ structure_check() searches for nearby cultist structures required for the invoca
return 0
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'>Do you wish to embrace the Geometer of Blood? <a href='?src=\ref[src];signmeup=1'>Click here to stop resisting the truth.</a> Or you could choose to continue resisting...</span>")
to_chat(convertee, "<span class='cult italic'>Do you wish to embrace the Geometer of Blood? <a href='?src=\ref[src];signmeup=1'>Click here to become a follower of Nar'sie.</a> Or you could choose to continue resisting and suffer a fate worse than death...</span>")
currentconversionman = convertee
conversiontimeout = world.time + (10 SECONDS)
convertee.Stun(100)
@@ -130,6 +130,7 @@
if(!owner.current||owner.current.stat==DEAD)
return
to_chat(owner.current, "<span class='userdanger'> Target eliminated: [victim.name]</span>")
LAZYINITLIST(targets_stolen)
for(var/objective_ in victim.objectives)
if(istype(objective_, /datum/objective/assassinate/internal))
var/datum/objective/assassinate/internal/objective = objective_
+1 -1
View File
@@ -1458,7 +1458,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
age = max(min( round(text2num(new_age)), AGE_MAX),AGE_MIN)
if("flavor_text")
var/msg = stripped_multiline_input(usr,"Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!","Flavor Text",html_decode(features["flavor_text"]), MAX_MESSAGE_LEN*2, TRUE) as null|message
var/msg = stripped_multiline_input(usr, "Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!", "Flavor Text", html_decode(features["flavor_text"]), MAX_MESSAGE_LEN*2, TRUE)
if(!isnull(msg))
msg = copytext(msg, 1, MAX_MESSAGE_LEN*2)
features["flavor_text"] = msg
@@ -124,7 +124,7 @@
// Save modified name
if(initial(name) != name)
assembly_params["name"] = name
// Save modified description
if(initial(desc) != desc)
assembly_params["desc"] = desc
@@ -144,7 +144,7 @@
return "Bad assembly name."
if(assembly_params["desc"] && !reject_bad_text(assembly_params["desc"]))
return "Bad assembly description."
if(assembly_params["detail_color"] && !(assembly_params["detail_color"] in color_whitelist))
if(assembly_params["detail_color"] && !reject_bad_text(assembly_params["detail_color"], 7))
return "Bad assembly color."
// Loads assembly parameters from a list
@@ -153,7 +153,7 @@
// Load modified name, if any.
if(assembly_params["name"])
name = assembly_params["name"]
// Load modified description, if any.
if(assembly_params["desc"])
desc = assembly_params["desc"]
@@ -260,7 +260,7 @@
else
return
if(do_mob(usr, src, POCKET_STRIP_DELAY/delay_denominator)) //placing an item into the pocket is 4 times faster
if(do_mob(usr, src, POCKET_STRIP_DELAY/delay_denominator, ignorehelditem = TRUE)) //placing an item into the pocket is 4 times faster
if(pocket_item)
if(pocket_item == (pocket_id == SLOT_R_STORE ? r_store : l_store)) //item still in the pocket we search
dropItemToGround(pocket_item)
@@ -1475,9 +1475,9 @@ GLOBAL_LIST_EMPTY(roundstart_races)
else if(aim_for_mouth && ( target_on_help || target_restrained || target_aiming_for_mouth))
playsound(target.loc, 'sound/weapons/slap.ogg', 50, 1, -1)
user.visible_message(
"<span class='danger'>[user] slaps [target] in the face!</span>",
"<span class='notice'>You slap [user == target ? "yourself" : target] in the face! </span>",\
user.visible_message(\
"<span class='danger'>\The [user] slaps \the [target] in the face!</span>",\
"<span class='notice'>You slap [user == target ? "yourself" : "\the [target]"] in the face! </span>",\
"You hear a slap."
)
if (!target.has_trait(TRAIT_NYMPHO))
@@ -1487,9 +1487,9 @@ GLOBAL_LIST_EMPTY(roundstart_races)
return FALSE
else if(aim_for_groin && (target == user || target.lying || same_dir) && (target_on_help || target_restrained || target_aiming_for_groin))
playsound(target.loc, 'sound/weapons/slap.ogg', 50, 1, -1)
user.visible_message(
"<span class='danger'>[user] slaps [target]'s ass!</span>",
"<span class='notice'>You slap [user == target ? "your" : target + "'s"] ass! </span>",\
user.visible_message(\
"<span class='danger'>\The [user] slaps \the [target]'s ass!</span>",\
"<span class='notice'>You slap [user == target ? "your" : "\the [target]'s"] ass!</span>",\
"You hear a slap."
)
if (target.canbearoused)
+1 -1
View File
@@ -698,7 +698,7 @@
who.visible_message("<span class='danger'>[src] tries to remove [who]'s [what.name].</span>", \
"<span class='userdanger'>[src] tries to remove [who]'s [what.name].</span>")
what.add_fingerprint(src)
if(do_mob(src, who, what.strip_delay))
if(do_mob(src, who, what.strip_delay, ignorehelditem = TRUE))
if(what && Adjacent(who))
if(islist(where))
var/list/L = where
+7 -6
View File
@@ -8,9 +8,9 @@
set src in usr
if(usr != src)
usr << "No."
var/msg = input(usr,"Set the flavor text in your 'examine' verb. Can also be used for OOC notes about your character.","Flavor Text",html_decode(flavor_text)) as message|null
if(msg != null)
var/msg = stripped_multiline_input(usr, "Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!", "Flavor Text", html_decode(flavor_text), MAX_MESSAGE_LEN*2, TRUE)
if(!isnull(msg))
msg = copytext(msg, 1, MAX_MESSAGE_LEN)
msg = html_encode(msg)
@@ -23,11 +23,12 @@
/mob/proc/print_flavor_text()
if(flavor_text && flavor_text != "")
var/msg = replacetext(flavor_text, "\n", " ")
// We are decoding and then encoding to not only get correct amount of characters, but also to prevent partial escaping characters being shown.
var/msg = html_decode(replacetext(flavor_text, "\n", " "))
if(lentext(msg) <= 40)
return "<span class='notice'>[msg]</span>"
return "<span class='notice'>[html_encode(msg)]</span>"
else
return "<span class='notice'>[copytext(msg, 1, 37)]... <a href='?src=[REF(src)];flavor_more=1'>More...</span></a>"
return "<span class='notice'>[html_encode(copytext(msg, 1, 37))]... <a href='?src=[REF(src)];flavor_more=1'>More...</span></a>"
/mob/proc/get_top_level_mob()
if(istype(src.loc,/mob)&&src.loc!=src)
+9 -9
View File
@@ -510,7 +510,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
name = "12g Scatter Laser shot Slugs"
desc = "An alternative 8-round Scatter Laser Shot magazine for use in the Bulldog shotgun."
item = /obj/item/ammo_box/magazine/m12g/scatter
cost = 5 // most armor has less laser protection then bullet
cost = 4 // most armor has less laser protection then bullet
/datum/uplink_item/ammo/shotgun/bag
name = "12g Ammo Duffel Bag"
@@ -776,7 +776,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
desc = "Fitted for use on any small caliber weapon with a threaded barrel, this suppressor will silence the \
shots of the weapon for increased stealth and superior ambushing capability."
item = /obj/item/suppressor
cost = 3
cost = 1
surplus = 10
exclude_modes = list(/datum/game_mode/nuclear/clown_ops)
@@ -844,7 +844,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
You will receive the unlock code upon activating the virus, and the new uplink may be charged with \
telecrystals normally."
item = /obj/item/cartridge/virus/frame
cost = 4
cost = 2
restricted = TRUE
/datum/uplink_item/stealthy_tools/agent_card
@@ -995,11 +995,11 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 1
/datum/uplink_item/device_tools/surgerybag_adv
name = "Syndicate Surgery Duffel Bag"
name = "Advanced Syndicate Surgery Duffel Bag"
desc = "The Syndicate surgery duffel bag is a toolkit containing all newest surgery tools, surgical drapes, \
a Syndicate brand MMI, a straitjacket, a muzzle, and a full Syndicate Combat Medic Kit."
item = /obj/item/storage/backpack/duffelbag/syndie/surgery_adv
cost = 15 //Mite be to cheap
cost = 10
/datum/uplink_item/device_tools/military_belt
name = "Chest Rig"
@@ -1041,7 +1041,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
such as AI units and cyborgs, over their private binary channel. Caution should \
be taken while doing this, as unless they are allied with you, they are programmed to report such intrusions."
item = /obj/item/encryptionkey/binary
cost = 5
cost = 2
surplus = 75
restricted = TRUE
@@ -1517,12 +1517,12 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 15
restricted_roles = list("Clown")
/datum/uplink_item/device_tools/honkpins //Idealy so they can place it into their own guns without needing cargo
/datum/uplink_item/device_tools/ultrahonkpins //Idealy so they can place it into their own guns without needing cargo
name = "Hilarious firing pin"
desc = "A single firing pin made for Clown agents, this firing pin makes any gun honk when fired if not a true clown! \
This firing pin also helps you fire the gun correctly. May the HonkMother HONK you agent."
item = /obj/item/firing_pin/clown
cost = 1
item = /obj/item/firing_pin/clown/ultra
cost = 2
restricted_roles = list("Clown")
/*
@@ -0,0 +1,5 @@
author: "WhiteHusky"
delete-after: True
changes:
- bugfix: "Flavor text with special characters will not get partially unescaped."
- bugfix: "Canceling when setting flavor text does not clear it anymore."
@@ -0,0 +1,4 @@
author: "Ghommie"
delete-after: True
changes:
- bugfix: "Fixes cult potentially stalling if the target is erased from existence without being sacced."
@@ -0,0 +1,4 @@
author: "UntoldTactics"
delete-after: True
changes:
- tweak: "Rewords the click here prompt given when an attempted conversion is done on an offer rune (for blood cult)"
@@ -0,0 +1,4 @@
author: "Ghommie"
delete-after: True
changes:
- bugfix: "fixes IAA."
@@ -0,0 +1,5 @@
author: "Trilbyspaceclone"
delete-after: True
changes:
- rscadd: "more box options"
- bugfix: "a lack of replaceable boxes"
@@ -0,0 +1,6 @@
author: "Ghommie"
delete-after: True
changes:
- balance: "EMPs now flick off stunbatons, they can be turned back on immediately by the user anyway."
- balance: "Stunbatons now very slowly consume charge whilst kept on, at a rate of 4/1000th of a standard batoning charge cost per tick."
- balance: "Softened up the charge cost checks to stop the above update from practically reducing the maximum uses of a stun baton by one. Now, should the remaining charge be lower than the hit cost, the resulting stun will be be proportional to the remaining charge divided by the hitcost, within a limit under which the stun batoning just won't happen."
@@ -0,0 +1,4 @@
author: "deathride58"
delete-after: True
changes:
- tweak: "The timer for stripping an item off of a spaceman is no longer interrupted by your active held item changing. This means you no longer have to worry about filling both of your hands when you're stripping items off of someone."
@@ -0,0 +1,4 @@
author: "Trilbyspaceclone"
delete-after: True
changes:
- tweak: "4 - > 5"
@@ -0,0 +1,4 @@
author: "Trilbyspaceclone"
delete-after: True
changes:
- tweak: "4tc - > 2tc"
@@ -0,0 +1,5 @@
author: "Trilbyspaceclone"
delete-after: True
changes:
- tweak: "15 - >10"
- bugfix: "both bags have the same name"
@@ -0,0 +1,4 @@
author: "Trilbyspaceclone"
delete-after: True
changes:
- tweak: "5 - > 2"
@@ -0,0 +1,4 @@
author: "Trilbyspaceclone"
delete-after: True
changes:
- tweak: "3 -> 1"
@@ -0,0 +1,4 @@
author: "Trilbyspaceclone"
delete-after: True
changes:
- tweak: "1->2 and ultra"
@@ -0,0 +1,4 @@
author: "Useroth"
delete-after: True
changes:
- bugfix: "After the PR which raised the ammo capacity of said magazines, due to the code, they ended up with an invalid icon state. Fixed through changing the icon state name in the icon file."
Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 62 KiB

@@ -245,43 +245,6 @@
// This function can not be undone; do not call this unless you are sure
/obj/machinery/cryopod/proc/despawn_occupant()
var/mob/living/mob_occupant = occupant
var/list/target_candidates = list()
if(istype(SSticker.mode, /datum/antagonist/cult))//thank
if("sacrifice" in SSticker.mode.cult)
for(var/mob/living/carbon/human/player in GLOB.player_list)
if(player.mind && !player.mind.has_antag_datum(/datum/antagonist/cult) && !is_convertable_to_cult(player) && player.stat != DEAD)
target_candidates += player.mind
target_candidates -= mob_occupant.mind
if(target_candidates.len == 0)
message_admins("Cult Sacrifice: Could not find unconvertable target, checking for convertable target.")
for(var/mob/living/carbon/human/player in GLOB.player_list)
if(player.mind && !player.mind.has_antag_datum(/datum/antagonist/cult) && player.stat != DEAD)
target_candidates += player.mind
listclearnulls(target_candidates)
if(LAZYLEN(target_candidates))
var/datum/objective/sacrifice/sac_objective = locate() in GLOB.objectives
sac_objective.target = pick(target_candidates)
sac_objective.update_explanation_text()
var/datum/job/sacjob = SSjob.GetJob(sac_objective.target.assigned_role)
var/datum/preferences/sacface = sac_objective.target.current.client.prefs
var/icon/reshape = get_flat_human_icon(null, sacjob, sacface)
reshape.Shift(SOUTH, 4)
reshape.Shift(EAST, 1)
reshape.Crop(7,4,26,31)
reshape.Crop(-5,-3,26,30)
sac_objective.sac_image = reshape
for(var/datum/mind/H in SSticker.mode.cult)
if(H.current)
to_chat(H.current, "<span class='danger'>Nar'Sie</span> murmurs, <span class='cultlarge'>[occupant] is beyond your reach. Sacrifice [sac_objective.target.current] instead...</span></span>")
else
message_admins("Cult Sacrifice: Could not find unconvertable or convertable target after cryopod. WELP!")
//Update any existing objectives involving this mob.
for(var/datum/objective/O in GLOB.objectives)
Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 44 KiB

+6 -6
View File
@@ -2502,12 +2502,6 @@
#include "code\modules\research\server.dm"
#include "code\modules\research\stock_parts.dm"
#include "code\modules\research\designs\AI_module_designs.dm"
#include "code\modules\research\designs\autolathe_desings\autolathe_designs_construction.dm"
#include "code\modules\research\designs\autolathe_desings\autolathe_designs_electronics.dm"
#include "code\modules\research\designs\autolathe_desings\autolathe_designs_medical_and_dinnerware.dm"
#include "code\modules\research\designs\autolathe_desings\autolathe_designs_sec_and_hacked.dm"
#include "code\modules\research\designs\autolathe_desings\autolathe_designs_tcomms_and_misc.dm"
#include "code\modules\research\designs\autolathe_desings\autolathe_designs_tools.dm"
#include "code\modules\research\designs\biogenerator_designs.dm"
#include "code\modules\research\designs\bluespace_designs.dm"
#include "code\modules\research\designs\comp_board_designs.dm"
@@ -2527,6 +2521,12 @@
#include "code\modules\research\designs\stock_parts_designs.dm"
#include "code\modules\research\designs\telecomms_designs.dm"
#include "code\modules\research\designs\weapon_designs.dm"
#include "code\modules\research\designs\autolathe_desings\autolathe_designs_construction.dm"
#include "code\modules\research\designs\autolathe_desings\autolathe_designs_electronics.dm"
#include "code\modules\research\designs\autolathe_desings\autolathe_designs_medical_and_dinnerware.dm"
#include "code\modules\research\designs\autolathe_desings\autolathe_designs_sec_and_hacked.dm"
#include "code\modules\research\designs\autolathe_desings\autolathe_designs_tcomms_and_misc.dm"
#include "code\modules\research\designs\autolathe_desings\autolathe_designs_tools.dm"
#include "code\modules\research\machinery\_production.dm"
#include "code\modules\research\machinery\circuit_imprinter.dm"
#include "code\modules\research\machinery\departmental_circuit_imprinter.dm"