diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm
index 92256192..224570da 100644
--- a/code/game/gamemodes/changeling/changeling.dm
+++ b/code/game/gamemodes/changeling/changeling.dm
@@ -54,6 +54,9 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
for(var/job in restricted_jobs)//Removing robots from the list
if(player.assigned_role == job)
possible_changelings -= player
+ continue
+ if(player.current.isipc()) //Removing ipc's
+ possible_changelings -= player
changeling_amount = 1 + round(num_players() / 10)
diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index 538e63dc..f8d6076b 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -829,6 +829,11 @@ var/list/datum/dna/hivemind_bank = list()
T.Paralyse(10)
T.make_jittery(1000)
if(T.reagents) T.reagents.add_reagent("lexorin", 40)
+
+ //Becase a deadly powerful attack should be logged
+ msg_admin_attack("[usr.name] ([usr.ckey]) Death Stung [T.name] ([T.ckey])")
+ usr.attack_log += text("\[[time_stamp()]\] Death stung [T.name] ([T.ckey])")
+ T.attack_log += text("\[[time_stamp()]\] Was death stung by [usr.name] ([usr.ckey])")
feedback_add_details("changeling_powers","DTHS")
return 1
diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm
index a8be5ea4..e0c63bd6 100644
--- a/code/game/gamemodes/vampire/vampire.dm
+++ b/code/game/gamemodes/vampire/vampire.dm
@@ -55,6 +55,9 @@
for(var/job in restricted_jobs)//Removing robots from the list
if(player.assigned_role == job)
possible_vampires -= player
+ continue
+ if(player.current.isipc())
+ possible_vampires -= player
vampire_amount = max(1,round(num_players() / 10)) //1 + round(num_players() / 10)
@@ -261,9 +264,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha
var/blood = 0
var/bloodtotal = 0 //used to see if we increased our blood total
var/bloodusable = 0 //used to see if we increased our blood usable
- src.attack_log += text("\[[time_stamp()]\] Bit [src.name] ([src.ckey]) in the neck and draining their blood")
- H.attack_log += text("\[[time_stamp()]\] Has been bit in the neck by [src.name] ([src.ckey])")
- log_attack("[src.name] ([src.ckey]) bit [H.name] ([H.ckey]) in the neck")
+
src.visible_message("\red [src.name] bites [H.name]'s neck!", "\red You bite [H.name]'s neck and begin to drain their blood.", "\blue You hear a soft puncture and a wet sucking noise")
if(!iscarbon(src))
H.LAssailant = null
@@ -327,8 +328,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha
vamp.powers.Add(VAMP_BATS)
if(!(VAMP_SCREAM in vamp.powers))
vamp.powers.Add(VAMP_SCREAM)
- // Commented out until we can figured out a way to stop this from spamming.
- //src << "\blue Your rejuvination abilities have improved and will now heal you over time when used."
+ src << "\blue Your rejuvination abilities have improved and will now heal you over time when used."
// TIER 3.5 (/vg/)
if(vamp.bloodtotal >= 250)
diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm
index 91b6337d..0fa8671d 100644
--- a/code/game/gamemodes/vampire/vampire_powers.dm
+++ b/code/game/gamemodes/vampire/vampire_powers.dm
@@ -11,6 +11,7 @@
var/datum/vampire/vampire = src.mind.vampire
if(!vampire)
+ msg_scopes("[src] has vampire verbs but isn't a vampire.")
world.log << "[src] has vampire verbs but isn't a vampire."
return 0
@@ -37,12 +38,14 @@
/mob/proc/vampire_affected(datum/mind/M)
//Other vampires aren't affected
if(mind && mind.vampire) return 0
- //Vampires who have reached their full potential can affect nearly everything
- if(M && M.vampire && (VAMP_FULL in M.vampire.powers))
- return 1
//Chaplains are resistant to vampire powers
if(mind && mind.assigned_role == "Chaplain")
return 0
+ if(mind && mind.current.isipc())//Not sure if this should be here but we can easily override.
+ return 0
+ //Vampires who have reached their full potential can affect nearly everything
+ if(M && M.vampire && (VAMP_FULL in M.vampire.powers))
+ return 1 // This doesn't really need to be here because of well the line below it.
return 1
/mob/proc/vampire_can_reach(mob/M as mob, active_range = 1)
@@ -59,6 +62,7 @@
if(!vampire) return
var/list/victims = list()
for(var/mob/living/carbon/C in view(active_range))
+ if(C==src) continue
victims += C
var/mob/living/carbon/T = input(src, "Victim?") as null|anything in victims
@@ -102,6 +106,9 @@
var/mob/living/carbon/C = M.current.vampire_active(20, 0, 1)
if(!C) return
+ if(C==usr)
+ M.current << "\red You can't do that to yourself"
+ return
M.current.visible_message("[M]'s eyes flash briefly as he stares into [C.name]'s eyes")
// M.current.remove_vampire_blood(20) Moved to remove if it works only.
if(M.current.vampire_power(20, 0))
@@ -133,6 +140,12 @@
var/mob/living/carbon/C = M.current.vampire_active(100, 0, 1)
if(!C) return
+ if(C==usr)
+ M.current << "\red You can't do that to yourself"
+ return
+ if(C.isipc())
+ M.current << "\red You can't to that to a machine"
+ return
if(!M.current.vampire_can_reach(C, 1))
M.current << "\red You cannot touch [C.name] from where you are standing!"
return
@@ -162,6 +175,9 @@
shutdown.speed = 1
shutdown.stage = 2
shutdown.clicks = 185
+ msg_admin_attack("[usr.name] ([usr.ckey]) gave [C.name] ([C.ckey]) the shutdown disease")
+ usr.attack_log += text("\[[time_stamp()]\] Gave [C.name] ([C.ckey]) the shutdown disease")
+ C.attack_log += text("\[[time_stamp()]\] Has been given the shutdown disease by [usr.name] ([usr.ckey])")
infect_virus2(C,shutdown,0)
M.current.remove_vampire_blood(100)
M.current.verbs -= /client/vampire/proc/vampire_disease
@@ -183,9 +199,11 @@
M.current << "You're blindfolded!"
return
for(var/mob/living/carbon/C in view(1))
- if(!C.vampire_affected(M)) continue
+ if(!C.vampire_affected(M))
+ if(!C.isipc())
+ continue
if(!M.current.vampire_can_reach(C, 1)) continue
- C.Stun(8)
+// C.Stun(8)
C.Weaken(8)
C.stuttering = 20
C << "\red You are blinded by [M.current]'s glare"
@@ -207,7 +225,7 @@
*/
/client/vampire/proc/vampire_screech()
set category = "Abilities"
- set name = "Chiroptean Screech (30)"
+ set name = "Chiropteran Screech (30)"
set desc = "An extremely loud shriek that stuns nearby humans in a four-tile radius." //and breaks windows as well ||Or would if duck knew how to code. end orig text.
var/datum/mind/M = usr.mind
if(!M) return
@@ -216,7 +234,9 @@
for(var/mob/living/carbon/C in hearers(4, M.current))
if(C == M.current) continue
if(ishuman(C) && (C:l_ear || C:r_ear) && istype((C:l_ear || C:r_ear), /obj/item/clothing/ears/earmuffs)) continue
- if(!C.vampire_affected(M)) continue
+ if(!C.vampire_affected(M))
+ if(!C.isipc())
+ continue
C << "You hear a ear piercing shriek and your senses dull!"
C.Weaken(8)
C.ear_deaf = 20
@@ -238,6 +258,12 @@
if(!M) return
var/mob/living/carbon/C = M.current.vampire_active(150, 0, 1)
if(!C) return
+ if(C==usr)
+ M.current << "\red You can't do that to yourself"
+ return
+ if(C.isipc())
+ M.current << "\red You can only enthrall humans"
+ return
M.current.visible_message("\red [M.current.name] bites [C.name]'s neck!", "\red You bite [C.name]'s neck and begin the flow of power.")
C << "You feel the tendrils of evil invade your mind."
if(!ishuman(C))
@@ -245,17 +271,16 @@
return
if(do_mob(M.current, C, 50))
- if(M.current.can_enthrall(C) && M.current.vampire_power(150, 0)) // recheck
- M.current.handle_enthrall(C)
- M.current.remove_vampire_blood(150)
- M.current.verbs -= /client/vampire/proc/vampire_enthrall
- spawn(1800) M.current.verbs += /client/vampire/proc/vampire_enthrall
+ if(M.current.can_enthrall(C)) // recheck
+ if(M.current.vampire_power(150, 0))
+ M.current.handle_enthrall(C)
+ M.current.remove_vampire_blood(150)
+ M.current.verbs -= /client/vampire/proc/vampire_enthrall
+ spawn(1800) M.current.verbs += /client/vampire/proc/vampire_enthrall
else
M.current << "\red You or your target either moved or you dont have enough usable blood."
return
-
-
/client/vampire/proc/vampire_cloak()
set category = "Abilities"
set name = "Cloak of Darkness (toggle)"
@@ -305,6 +330,7 @@
return 0
if(!C.vampire_affected(mind))
C.visible_message("\red [C] seems to resist the takeover!", "\blue Your faith of [ticker.Bible_deity_name] has kept your mind clear of all evil")
+ return 0
if(!ishuman(C))
src << "\red You can only enthrall humans!"
return 0
@@ -312,6 +338,7 @@
/mob/proc/handle_enthrall(mob/living/carbon/human/H as mob)
if(!istype(H))
+ msg_scopes("handle_enthrall fucked up with no H < [src]")
src << "\red SOMETHING WENT WRONG, YELL AT POMF OR NEXIS"
return 0
var/ref = "\ref[src.mind]"
@@ -319,6 +346,7 @@
ticker.mode.thralls[ref] = list(H.mind)
else
ticker.mode.thralls[ref] += H.mind
+ msg_scopes("[H.name] Changed in handle_enthrall") //purely here to see live changes incase of unexpected things
ticker.mode.enthralled.Add(H.mind)
ticker.mode.enthralled[H.mind] = src.mind
H.mind.special_role = "VampThrall"
@@ -326,7 +354,7 @@
src << "\red You have successfully Enthralled [H.name]. If they refuse to do as you say just adminhelp."
ticker.mode.update_vampire_icons_added(H.mind)
ticker.mode.update_vampire_icons_added(src.mind)
- log_admin("[ckey(src.key)] has mind-slaved [ckey(H.key)].")
+ msg_admin_attack("[name]([ckey]) has mind-slaved [H.name]([H.ckey]).")
/client/vampire/proc/vampire_bats()
set category = "Abilities"
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index d5a7b205..e4f793ce 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -350,34 +350,50 @@ var/global/datum/controller/occupations/job_master
var/datum/job/job = GetJob(rank)
if(job)
//Equip custom gear loadout.
- if(H.client.prefs.gear && H.client.prefs.gear.len)
+ switch(rank)
+ if("Cyborg","AI","Clown")//Because yeah
+ else
+ if(H.client.prefs.gear && H.client.prefs.gear.len)
- for(var/thing in H.client.prefs.gear)
- var/datum/gear/G = gear_datums[thing]
- if(G)
- var/permitted
- if(G.allowed_roles)
- for(var/job_name in G.allowed_roles)
- if(job.title == job_name)
+ for(var/thing in H.client.prefs.gear)
+ var/datum/gear/G = gear_datums[thing]
+ if(G)
+ var/permitted
+ if(G.allowed_roles)
+ for(var/job_name in G.allowed_roles)
+ if(job.title == job_name)
+ permitted = 1
+ else
permitted = 1
- else
- permitted = 1
- if(G.whitelisted && !is_alien_whitelisted(H, G.whitelisted))
- permitted = 0
+ if(G.whitelisted && !is_alien_whitelisted(H, G.whitelisted))
+ permitted = 0
- if(!permitted)
- H << "\red Your current job or whitelist status does not permit you to spawn with [thing]!"
- continue
+ if(!permitted)
+ H << "\red Your current job or whitelist status does not permit you to spawn with [thing]!"
+ continue
- if(G.slot)
- H.equip_to_slot_or_del(new G.path(H), G.slot)
- else
- spawn(1)
- new G.path(get_turf(H))
+ if(G.slot)
+ msg_scopes("G.slot = [G.slot]")
+ if(!H.equip_to_slot_or_del(new G.path(H), G.slot))
+ spawn(6)
+ if(!H.equip_to_slot_or_del(new G.path(H.back), slot_in_backpack))
+ new G.path(H.loc)
+ else
+ if(H.backbag)
+ msg_scopes("G.path = [G.path]")
+ spawn(6) //I can't beleive this worked: 4 works but I want to give a little time for lags
+ if(!H.equip_to_slot_or_del(new G.path(H.back), slot_in_backpack))
+ new G.path(H.loc)
+ else
+ msg_scopes("G.path = [G.path] | This got called, see if [H.name] has it") // If I never see this in game then Yiss
+ new G.path(H.loc)
+// spawn(1)
+// new G.path(get_turf(H.loc))
//Equip job items.
job.equip(H)
else
+ msg_scopes("[H.mind.name] has rank: [rank] and this thing happened.")
H << "Your job is [rank] and the game just can't handle it! Please report this bug to an administrator."
H.job = rank
diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm
index bc6c01bb..8506ec36 100644
--- a/code/modules/client/preferences_gear.dm
+++ b/code/modules/client/preferences_gear.dm
@@ -378,6 +378,9 @@ proc/populate_gear_list()
allowed_roles = list("Roboticist", "Scientist", "Research Director")
//Species-specific gear datums.
+
+//Taken out until fixes are done
+/*
/datum/gear/zhan_furs
display_name = "Zhan-Khazan furs"
path = /obj/item/clothing/suit/tajaran/furs
@@ -391,6 +394,7 @@ proc/populate_gear_list()
cost = 2
slot = slot_head
whitelisted = "Tajaran"
+*/
/datum/gear/unathi_robe
display_name = "roughspun robe"
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index b1a26c44..8b35a218 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -40,6 +40,9 @@
h_style = "blue IPC screen"
..(new_loc, "Machine")
+/mob/living/carbon/human/machine/isipc()
+ return 1
+
/mob/living/carbon/human/kocasslani/New(var/new_loc)
h_style = "Bald"
..(new_loc, "Kocasslani")
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index a9f2ff63..9d9f1145 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -124,7 +124,14 @@
if(mind && mind.vampire && (mind in ticker.mode.vampires))
M << "\red Your fangs fail to pierce [src.name]'s cold flesh"
return 0
+ if(isipc())
+ M << "\red They have no blood"
+ return 0
//we're good to suck the blood, blaah
+ //and leave an attack log
+ M.attack_log += text("\[[time_stamp()]\] Bit [src.name] ([src.ckey]) in the neck and draining their blood")
+ src.attack_log += text("\[[time_stamp()]\] Has been bit in the neck by [M.name] ([M.ckey])")
+ msg_admin_attack("[M.name] ([M.ckey]) bit [src.name] ([src.ckey]) in the neck")
M.handle_bloodsucking(src)
return
//end vampire codes
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 5c5c0416..3223a39c 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -109,6 +109,9 @@
if(life_tick > 5 && timeofdeath && (timeofdeath < 5 || world.time - timeofdeath > 6000)) //We are long dead, or we're junk mobs spawned like the clowns on the clown shuttle
return //We go ahead and process them 5 times for HUD images and other stuff though.
+ if(stat == DEAD && floating)
+ float(0)
+
//Handle temperature/pressure differences between body and environment
handle_environment(environment) //Optimized a good bit.
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 6dc3bb20..1f5cce5f 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -64,43 +64,47 @@
return
var/list/obj/item/used_radios = new
+
switch (message_mode)
if("headset")
- if(l_ear && istype(l_ear,/obj/item/device/radio))
- var/obj/item/device/radio/R = l_ear
- R.talk_into(src,message,null,verb,speaking)
- used_radios += l_ear
- else if(r_ear && istype(r_ear,/obj/item/device/radio))
- var/obj/item/device/radio/R = r_ear
- R.talk_into(src,message,null,verb,speaking)
- used_radios += r_ear
+ if(!(stunned >= 4))
+ if(l_ear && istype(l_ear,/obj/item/device/radio))
+ var/obj/item/device/radio/R = l_ear
+ R.talk_into(src,message,null,verb,speaking)
+ used_radios += l_ear
+ else if(r_ear && istype(r_ear,/obj/item/device/radio))
+ var/obj/item/device/radio/R = r_ear
+ R.talk_into(src,message,null,verb,speaking)
+ used_radios += r_ear
if("right ear")
- var/obj/item/device/radio/R
- var/has_radio = 0
- if(r_ear && istype(r_ear,/obj/item/device/radio))
- R = r_ear
- has_radio = 1
- if(r_hand && istype(r_hand, /obj/item/device/radio))
- R = r_hand
- has_radio = 1
- if(has_radio)
- R.talk_into(src,message,null,verb,speaking)
- used_radios += R
+ if(!(stunned >= 4))
+ var/obj/item/device/radio/R
+ var/has_radio = 0
+ if(r_ear && istype(r_ear,/obj/item/device/radio))
+ R = r_ear
+ has_radio = 1
+ if(r_hand && istype(r_hand, /obj/item/device/radio))
+ R = r_hand
+ has_radio = 1
+ if(has_radio)
+ R.talk_into(src,message,null,verb,speaking)
+ used_radios += R
if("left ear")
- var/obj/item/device/radio/R
- var/has_radio = 0
- if(l_ear && istype(l_ear,/obj/item/device/radio))
- R = l_ear
- has_radio = 1
- if(l_hand && istype(l_hand,/obj/item/device/radio))
- R = l_hand
- has_radio = 1
- if(has_radio)
- R.talk_into(src,message,null,verb,speaking)
- used_radios += R
+ if(!(stunned >= 4))
+ var/obj/item/device/radio/R
+ var/has_radio = 0
+ if(l_ear && istype(l_ear,/obj/item/device/radio))
+ R = l_ear
+ has_radio = 1
+ if(l_hand && istype(l_hand,/obj/item/device/radio))
+ R = l_hand
+ has_radio = 1
+ if(has_radio)
+ R.talk_into(src,message,null,verb,speaking)
+ used_radios += R
if("intercom")
for(var/obj/item/device/radio/intercom/I in view(1, null))
@@ -120,14 +124,15 @@
Changeling << "[mind.changeling.changelingID]: [message]"
return
else
- if(message_mode)
- if(message_mode in (radiochannels | "department"))
- if(l_ear && istype(l_ear,/obj/item/device/radio))
- l_ear.talk_into(src,message, message_mode, verb, speaking)
- used_radios += l_ear
- else if(r_ear && istype(r_ear,/obj/item/device/radio))
- r_ear.talk_into(src,message, message_mode, verb, speaking)
- used_radios += r_ear
+ if(!(stunned >= 4))
+ if(message_mode)
+ if(message_mode in (radiochannels | "department"))
+ if(l_ear && istype(l_ear,/obj/item/device/radio))
+ l_ear.talk_into(src,message, message_mode, verb, speaking)
+ used_radios += l_ear
+ else if(r_ear && istype(r_ear,/obj/item/device/radio))
+ r_ear.talk_into(src,message, message_mode, verb, speaking)
+ used_radios += r_ear
if(used_radios.len)
@@ -212,9 +217,6 @@
return verb
-
-
-
/mob/living/carbon/human/proc/handle_speech_problems(var/message)
var/list/returns[3]
var/verb = "says"
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 12614e3a..0fdab79c 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -123,3 +123,9 @@
return 0
// End BS12 momentum-transfer code.
+
+//Why did I place it here?
+//Remind me to place this somewhere else
+//I sware this uses less memory
+/mob/living/proc/isipc()
+ return 0
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index 261df980..e58a086c 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -481,6 +481,5 @@
msg_scopes("[name] was made to float")
else
msg_scopes("[real_name] was made to float")
- msg_scopes("[real_name] was told to stop floating")
animate(src, pixel_y = initial(pixel_y), time = 10)
floating = 0
\ No newline at end of file
diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm
index a4445612..36b102ba 100644
--- a/code/modules/virus2/effect.dm
+++ b/code/modules/virus2/effect.dm
@@ -127,7 +127,7 @@
C.status |= ORGAN_DEAD
H.update_body(1)
if(multiplier < 1) multiplier = 1
- H.adjustToxLoss(15*multiplier)
+ H.adjustToxLoss(10*multiplier)
vampire
stage = 3
diff --git a/html/changelog.html b/html/changelog.html
index af11f6c3..ff535791 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -60,6 +60,10 @@ should be listed in the changelog upon commit though. Thanks. -->
10 August 2014
SoundScopes updated:
+ - IPC's can no longer be absorbed by a ling
+ - Vampires can no longer bite themselves
+ - Chaplain can no longer be a vampire
+ - Custom loadouts now spawn with you
- Drones removed from auto-traitor selection
- Auto-traitor now listens to traitor bans
- Engineer Apprentice access
@@ -85,6 +89,7 @@ should be listed in the changelog upon commit though. Thanks. -->
- Faxes can be sent through request consoles
- Vampires
- Gun power changed a little
+ - No longer able to use radios if you're stunned
- Shotguns require 2 hands to be fired
- Delta level when called by an admin destroys the station
- Map changes