"
-
- popup.set_content(temp_html)
- popup.open()
-
-
-/obj/machinery/computer/scan_consolenew/Topic(href, href_list)
- if(..())
- return
- if(!isturf(usr.loc))
- return
- if(!( (isturf(loc) && in_range(src, usr)) || istype(usr, /mob/living/silicon) ))
- return
- if(current_screen == "working")
- return
-
- add_fingerprint(usr)
- usr.set_machine(src)
-
- var/mob/living/carbon/viable_occupant
- if(connected)
- viable_occupant = connected.occupant
- if(!istype(viable_occupant) || !viable_occupant.dna || (viable_occupant.disabilities & NOCLONE))
- viable_occupant = null
-
- //Basic Tasks///////////////////////////////////////////
- var/num = round(text2num(href_list["num"]))
- var/last_change
- switch(href_list["task"])
- if("togglelock")
- if(connected) connected.locked = !connected.locked
- if("toggleopen")
- if(connected) connected.toggle_open(usr)
- if("setduration")
- if(!num)
- num = round(input(usr, "Choose pulse duration:", "Input an Integer", null) as num|null)
- if(num)
- radduration = Wrap(num, 1, RADIATION_DURATION_MAX+1)
- if("setstrength")
- if(!num)
- num = round(input(usr, "Choose pulse strength:", "Input an Integer", null) as num|null)
- if(num)
- radstrength = Wrap(num, 1, RADIATION_STRENGTH_MAX+1)
- if("screen")
- current_screen = href_list["text"]
- if("rejuv")
- if(viable_occupant && viable_occupant.reagents)
- var/epinephrine_amount = viable_occupant.reagents.get_reagent_amount("epinephrine")
- var/can_add = max(min(REJUVENATORS_MAX - epinephrine_amount, REJUVENATORS_INJECT), 0)
- viable_occupant.reagents.add_reagent("epinephrine", can_add)
- if("setbufferlabel")
- var/text = sanitize(input(usr, "Input a new label:", "Input an Text", null) as text|null)
- if(num && text)
- num = Clamp(num, 1, NUMBER_OF_BUFFERS)
- var/list/buffer_slot = buffer[num]
- if(istype(buffer_slot))
- buffer_slot["label"] = text
- if("setbuffer")
- if(num && viable_occupant)
- num = Clamp(num, 1, NUMBER_OF_BUFFERS)
- buffer[num] = list(
- "label"="Buffer[num]:[viable_occupant.real_name]",
- "UI"=viable_occupant.dna.uni_identity,
- "SE"=viable_occupant.dna.struc_enzymes,
- "UE"=viable_occupant.dna.unique_enzymes,
- "name"=viable_occupant.real_name,
- "blood_type"=viable_occupant.dna.blood_type
- )
- if("clearbuffer")
- if(num)
- num = Clamp(num, 1, NUMBER_OF_BUFFERS)
- var/list/buffer_slot = buffer[num]
- if(istype(buffer_slot))
- buffer_slot.Cut()
- if("transferbuffer")
- if(num && viable_occupant && viable_occupant.stat != DEAD)
- num = Clamp(num, 1, NUMBER_OF_BUFFERS)
- var/list/buffer_slot = buffer[num]
- if(istype(buffer_slot)) //15 and 40 are just magic numbers that were here before so i didnt touch them, they are initial boundaries of damage
- viable_occupant.radiation += rand(15/(connected.damage_coeff ** 2),40/(connected.damage_coeff ** 2)) //Each laser level reduces damage by lvl^2, so no effect on 1 lvl, 4 times less damage on 2 and 9 times less damage on 3
- switch(href_list["text"]) //Numbers are this high because other way upgrading laser is just not worth the hassle, and i cant think of anything better to inmrove
- if("se")
- if(buffer_slot["SE"])
- viable_occupant.dna.struc_enzymes = buffer_slot["SE"]
- domutcheck(viable_occupant)
- if("ui")
- if(buffer_slot["UI"])
- viable_occupant.dna.uni_identity = buffer_slot["UI"]
- updateappearance(viable_occupant)
- else
- if(buffer_slot["name"] && buffer_slot["UE"] && buffer_slot["blood_type"])
- viable_occupant.real_name = buffer_slot["name"]
- viable_occupant.name = buffer_slot["name"]
- viable_occupant.dna.unique_enzymes = buffer_slot["UE"]
- viable_occupant.dna.blood_type = buffer_slot["blood_type"]
- updateappearance(viable_occupant)
- if("injector")
- if(num && injectorready)
- num = Clamp(num, 1, NUMBER_OF_BUFFERS)
- var/list/buffer_slot = buffer[num]
- if(istype(buffer_slot))
- var/obj/item/weapon/dnainjector/I
- switch(href_list["text"])
- if("se")
- if(buffer_slot["SE"])
- I = new /obj/item/weapon/dnainjector(loc)
- for(var/datum/mutation/human/HM in good_mutations + bad_mutations + not_good_mutations)
- if(HM.check_block_string(buffer_slot["SE"]))
- if(prob(HM.get_chance))
- I.add_mutations.Add(HM)
- else
- I.remove_mutations.Add(HM)
- I.damage_coeff = connected.damage_coeff
- if("ui")
- if(buffer_slot["UI"])
- I = new /obj/item/weapon/dnainjector(loc)
- I.fields = list("UI"=buffer_slot["UI"])
- I.damage_coeff = connected.damage_coeff
- else
- if(buffer_slot["name"] && buffer_slot["UE"] && buffer_slot["blood_type"])
- I = new /obj/item/weapon/dnainjector(loc)
- I.fields = list("name"=buffer_slot["name"], "UE"=buffer_slot["UE"], "blood_type"=buffer_slot["blood_type"])
- I.damage_coeff = connected.damage_coeff
- if(I)
- injectorready = 0
- spawn(INJECTOR_TIMEOUT)
- injectorready = 1
- if("loaddisk")
- if(num && diskette && diskette.fields)
- num = Clamp(num, 1, NUMBER_OF_BUFFERS)
- buffer[num] = diskette.fields.Copy()
- if("savedisk")
- if(num && diskette && !diskette.read_only)
- num = Clamp(num, 1, NUMBER_OF_BUFFERS)
- var/list/buffer_slot = buffer[num]
- if(istype(buffer_slot))
- diskette.name = "data disk \[[buffer_slot["label"]]\]"
- diskette.fields = buffer_slot.Copy()
- if("ejectdisk")
- if(diskette)
- diskette.loc = get_turf(src)
- diskette = null
- if("pulseui","pulsese")
- if(num && viable_occupant && connected && viable_occupant.stat != DEAD)
- radduration = Wrap(radduration, 1, RADIATION_DURATION_MAX+1)
- radstrength = Wrap(radstrength, 1, RADIATION_STRENGTH_MAX+1)
-
- var/locked_state = connected.locked
- connected.locked = 1
-
- current_screen = "working"
- ShowInterface(usr)
-
- sleep(radduration*10)
- current_screen = "mainmenu"
-
- if(viable_occupant && connected && connected.occupant==viable_occupant)
- viable_occupant.radiation += (RADIATION_IRRADIATION_MULTIPLIER*radduration*radstrength)/(connected.damage_coeff ** 2) //Read comment in "transferbuffer" section above for explanation
- switch(href_list["task"]) //Same thing as there but values are even lower, on best part they are about 0.0*, effectively no damage
- if("pulseui")
- var/len = length(viable_occupant.dna.uni_identity)
- num = Wrap(num, 1, len+1)
- num = randomize_radiation_accuracy(num, radduration + (connected.precision_coeff ** 2), len) //Each manipulator level above 1 makes randomization as accurate as selected time + manipulator lvl^2
- //Value is this high for the same reason as with laser - not worth the hassle of upgrading if the bonus is low
- var/block = round((num-1)/DNA_BLOCK_SIZE)+1
- var/subblock = num - block*DNA_BLOCK_SIZE
- last_change = "UI #[block]-[subblock]; "
-
- var/hex = copytext(viable_occupant.dna.uni_identity, num, num+1)
- last_change += "[hex]"
- hex = scramble(hex, radstrength, radduration)
- last_change += "->[hex]"
-
- viable_occupant.dna.uni_identity = copytext(viable_occupant.dna.uni_identity, 1, num) + hex + copytext(viable_occupant.dna.uni_identity, num+1, 0)
- updateappearance(viable_occupant)
- if("pulsese")
- var/len = length(viable_occupant.dna.struc_enzymes)
- num = Wrap(num, 1, len+1)
- num = randomize_radiation_accuracy(num, radduration + (connected.precision_coeff ** 2), len)
-
- var/block = round((num-1)/DNA_BLOCK_SIZE)+1
- var/subblock = num - block*DNA_BLOCK_SIZE
- last_change = "SE #[block]-[subblock]; "
-
- var/hex = copytext(viable_occupant.dna.struc_enzymes, num, num+1)
- last_change += "[hex]"
- hex = scramble(hex, radstrength, radduration)
- last_change += "->[hex]"
-
- viable_occupant.dna.struc_enzymes = copytext(viable_occupant.dna.struc_enzymes, 1, num) + hex + copytext(viable_occupant.dna.struc_enzymes, num+1, 0)
- domutcheck(viable_occupant)
- else
- current_screen = "mainmenu"
-
- if(connected)
- connected.locked = locked_state
-
- ShowInterface(usr,last_change)
-
-
-/////////////////////////// DNA MACHINES
-#undef INJECTOR_TIMEOUT
-#undef REJUVENATORS_INJECT
-#undef REJUVENATORS_MAX
-#undef NUMBER_OF_BUFFERS
-
-#undef RADIATION_STRENGTH_MAX
-#undef RADIATION_STRENGTH_MULTIPLIER
-
-#undef RADIATION_DURATION_MAX
-#undef RADIATION_ACCURACY_MULTIPLIER
-
-#undef RADIATION_IRRADIATION_MULTIPLIER
-
-//#undef BAD_MUTATION_DIFFICULTY
-//#undef GOOD_MUTATION_DIFFICULTY
-//#undef OP_MUTATION_DIFFICULTY
-
//value in range 1 to values. values must be greater than 0
//all arguments assumed to be positive integers
/proc/construct_block(value, values, blocksize=DNA_BLOCK_SIZE)
@@ -968,10 +340,4 @@
value = values
return value
-
-/datum/dna/proc/is_same_as(datum/dna/D)
- if(uni_identity == D.uni_identity && struc_enzymes == D.struc_enzymes && real_name == D.real_name)
- if(species == D.species && features == D.features && blood_type == D.blood_type)
- return 1
- return 0
-
+/////////////////////////// DNA HELPER-PROCS
\ No newline at end of file
diff --git a/code/game/gamemodes/abduction/abduction.dm b/code/game/gamemodes/abduction/abduction.dm
index 0b710001f38..1151de4f55f 100644
--- a/code/game/gamemodes/abduction/abduction.dm
+++ b/code/game/gamemodes/abduction/abduction.dm
@@ -107,7 +107,7 @@
H = agent.current
L = agent_landmarks[team_number]
H.loc = L.loc
- hardset_dna(H, null, null, null, null, /datum/species/abductor)
+ H.set_species(/datum/species/abductor)
S = H.dna.species
S.agent = 1
S.team = team_number
@@ -115,13 +115,12 @@
equip_common(H,team_number)
equip_agent(H,team_number)
greet_agent(agent,team_number)
- H.regenerate_icons()
scientist = scientists[team_number]
H = scientist.current
L = scientist_landmarks[team_number]
H.loc = L.loc
- hardset_dna(H, null, null, null, null, /datum/species/abductor)
+ H.set_species(/datum/species/abductor)
S = H.dna.species
S.scientist = 1
S.team = team_number
@@ -129,7 +128,6 @@
equip_common(H,team_number)
equip_scientist(H,team_number)
greet_scientist(scientist,team_number)
- H.regenerate_icons()
return ..()
//Used for create antag buttons
@@ -156,7 +154,7 @@
H = agent.current
L = agent_landmarks[team_number]
H.loc = L.loc
- hardset_dna(H, null, null, null, null, /datum/species/abductor)
+ H.set_species(/datum/species/abductor)
S = H.dna.species
S.agent = 1
S.team = team_number
@@ -164,13 +162,13 @@
equip_common(H,team_number)
equip_agent(H,team_number)
greet_agent(agent,team_number)
- H.regenerate_icons()
+
scientist = scientists[team_number]
H = scientist.current
L = scientist_landmarks[team_number]
H.loc = L.loc
- hardset_dna(H, null, null, null, null, /datum/species/abductor)
+ H.set_species(/datum/species/abductor)
S = H.dna.species
S.scientist = 1
S.team = team_number
@@ -178,7 +176,7 @@
equip_common(H,team_number)
equip_scientist(H,team_number)
greet_scientist(scientist,team_number)
- H.regenerate_icons()
+
/datum/game_mode/abduction/proc/greet_agent(datum/mind/abductor,team_number)
@@ -332,7 +330,7 @@
if(!owner.current || !ishuman(owner.current))
return 0
var/mob/living/carbon/human/H = owner.current
- if(!H.dna || !H.dna.species || !(H.dna.species.id == "abductor"))
+ if(H.dna.species.id != "abductor")
return 0
var/datum/species/abductor/S = H.dna.species
ab_team = S.team
diff --git a/code/game/gamemodes/abduction/abduction_gear.dm b/code/game/gamemodes/abduction/abduction_gear.dm
index 0793989952f..94966530738 100644
--- a/code/game/gamemodes/abduction/abduction_gear.dm
+++ b/code/game/gamemodes/abduction/abduction_gear.dm
@@ -288,7 +288,7 @@
var/obj/machinery/abductor/console/console
if(ishuman(source))
var/mob/living/carbon/human/H = source
- if(H.dna && istype(H.dna.species, /datum/species/abductor))
+ if(H.dna.species.id == "abductor")
var/datum/species/abductor/S = H.dna.species
console = get_team_console(S.team)
home = console.pad
@@ -405,8 +405,6 @@ Congratulations! You are now trained for xenobiology research!"}
if(!ishuman(user))
return 0
var/mob/living/carbon/human/H = user
- if(!H.dna)
- return 0
if(H.dna.species.id != "abductor")
return 0
return 1
@@ -499,8 +497,7 @@ Congratulations! You are now trained for xenobiology research!"}
if(ishuman(L))
var/mob/living/carbon/human/H = L
- if(H.dna && H.dna.species)
- species = "[H.dna.species.name]"
+ species = "[H.dna.species.name]"
if(L.mind && L.mind.changeling)
species = "Changeling lifeform"
var/obj/item/organ/internal/gland/temp = locate() in H.internal_organs
diff --git a/code/game/gamemodes/abduction/abduction_surgery.dm b/code/game/gamemodes/abduction/abduction_surgery.dm
index f22f188945b..a97011d53db 100644
--- a/code/game/gamemodes/abduction/abduction_surgery.dm
+++ b/code/game/gamemodes/abduction/abduction_surgery.dm
@@ -8,7 +8,7 @@
if(!ishuman(user))
return 0
var/mob/living/carbon/human/H = user
- if(H.dna && istype(H.dna.species, /datum/species/abductor))
+ if(H.dna.species.id == "abductor")
return 1
if((locate(/obj/item/weapon/implant/abductor) in H))
return 1
diff --git a/code/game/gamemodes/abduction/gland.dm b/code/game/gamemodes/abduction/gland.dm
index fd2ecdcce4c..db0aa0c32dc 100644
--- a/code/game/gamemodes/abduction/gland.dm
+++ b/code/game/gamemodes/abduction/gland.dm
@@ -120,9 +120,7 @@
/obj/item/organ/internal/gland/pop/activate()
owner << "You feel unlike yourself."
var/species = pick(list(/datum/species/lizard,/datum/species/slime,/datum/species/plant/pod,/datum/species/fly))
- hardset_dna(owner, null, null, null, null, species)
- owner.regenerate_icons()
- return
+ owner.set_species(species)
/obj/item/organ/internal/gland/ventcrawling
origin_tech = "materials=4;biotech=5;bluespace=3"
@@ -241,7 +239,7 @@
/obj/effect/cocoon/abductor/proc/Copy(mob/living/carbon/human/H)
var/mob/living/carbon/human/interactive/greytide/clone = new(src)
- hardset_dna(clone,H.dna.uni_identity,H.dna.struc_enzymes,H.real_name, H.dna.blood_type, H.dna.species.type, H.dna.features)
+ clone.hardset_dna(H.dna.uni_identity,H.dna.struc_enzymes,H.real_name, H.dna.blood_type, H.dna.species.type, H.dna.features)
//There's no define for this / get all items ?
var/list/slots = list(slot_back,slot_w_uniform,slot_wear_suit,\
diff --git a/code/game/gamemodes/abduction/machinery/console.dm b/code/game/gamemodes/abduction/machinery/console.dm
index 725ebf46091..24f17a5ce92 100644
--- a/code/game/gamemodes/abduction/machinery/console.dm
+++ b/code/game/gamemodes/abduction/machinery/console.dm
@@ -4,8 +4,6 @@
var/team = 0
/obj/machinery/abductor/proc/IsAbductor(mob/living/carbon/human/H)
- if(!H.dna)
- return 0
return H.dna.species.id == "abductor"
/obj/machinery/abductor/proc/IsAgent(mob/living/carbon/human/H)
diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm
index 78e195f331c..722f1bce2af 100644
--- a/code/game/gamemodes/antag_spawner.dm
+++ b/code/game/gamemodes/antag_spawner.dm
@@ -98,6 +98,7 @@
M.mind.name = newname
M.real_name = newname
M.name = newname
+ M.dna.update_dna_identity()
var/datum/objective/protect/new_objective = new /datum/objective/protect
new_objective.owner = M:mind
new_objective:target = usr:mind
diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm
index a88707f19cc..119d38f0645 100644
--- a/code/game/gamemodes/changeling/changeling.dm
+++ b/code/game/gamemodes/changeling/changeling.dm
@@ -346,7 +346,8 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas
return
if(has_dna(target.dna))
user << "We already have this DNA in storage!"
- if(!check_dna_integrity(target))
+ return
+ if(!target.has_dna())
user << "[target] is not compatible with our biology."
return
return 1
@@ -405,10 +406,9 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas
/proc/changeling_transform(var/mob/living/carbon/human/user, var/datum/changelingprofile/chosen_prof)
var/datum/dna/chosen_dna = chosen_prof.dna
user.real_name = chosen_prof.name
- user.dna = chosen_dna
- hardset_dna(user, null, null, null, null, chosen_dna.species.type, chosen_dna.features)
- domutcheck(user)
- updateappearance(user)
+ chosen_dna.transfer_identity(user, 1)
+ user.updateappearance(mutcolor_update=1)
+ user.domutcheck()
//vars hackery. not pretty, but better than the alternative.
for(var/slot in slots)
diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm
index e42e1fad641..d9f6faa9457 100644
--- a/code/game/gamemodes/changeling/evolution_menu.dm
+++ b/code/game/gamemodes/changeling/evolution_menu.dm
@@ -388,8 +388,6 @@ var/list/sting_paths
/mob/proc/remove_changeling_powers(keep_free_powers=0)
if(ishuman(src) || ismonkey(src))
if(mind && mind.changeling)
- digitalcamo = 0
- digitalinvis = 0
mind.changeling.changeling_speak = 0
mind.changeling.reset()
for(var/obj/effect/proc_holder/changeling/p in mind.changeling.purchasedpowers)
diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm
index 054035f2e14..2d8316edfa5 100644
--- a/code/game/gamemodes/changeling/powers/absorb.dm
+++ b/code/game/gamemodes/changeling/powers/absorb.dm
@@ -130,7 +130,7 @@
if((target.disabilities & NOCLONE) || (target.disabilities & HUSK))
user << "DNA of [target] is ruined beyond usability!"
return
- if(!check_dna_integrity(target) || !ishuman(target))
+ if(!ishuman(target))
user << "[target] is not compatible with this ability."
return
return 1
diff --git a/code/game/gamemodes/changeling/powers/chameleon_skin.dm b/code/game/gamemodes/changeling/powers/chameleon_skin.dm
index 36b7ba87339..f39505fa712 100644
--- a/code/game/gamemodes/changeling/powers/chameleon_skin.dm
+++ b/code/game/gamemodes/changeling/powers/chameleon_skin.dm
@@ -10,17 +10,21 @@
/obj/effect/proc_holder/changeling/chameleon_skin/sting_action(mob/user)
- var/mob/living/carbon/human/H = user //SHOULD always be human, because req_human = 1
- if(!istype(H))
+ var/mob/living/carbon/human/H = user //SHOULD always be human, because req_human = 1 //phil235 so why is it needd?
+ if(!istype(H)) // req_human could be done in can_sting stuff.
return
var/datum/mutation/human/HM = mutations_list[CHAMELEON]
- if(H.dna && H.dna.mutations)
- if(HM in H.dna.mutations)
- HM.force_lose(H)
- else
- HM.force_give(H)
+ if(HM in H.dna.mutations)
+ HM.force_lose(H)
+ else
+ HM.force_give(H)
feedback_add_details("changeling_powers","CS")
return 1
-
+/obj/effect/proc_holder/changeling/chameleon_skin/on_refund(mob/user)
+ if(user.has_dna())
+ var/mob/living/carbon/C = user
+ var/datum/mutation/human/HM = mutations_list[CHAMELEON]
+ if(HM in C.dna.mutations)
+ HM.force_lose(C)
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/digitalcamo.dm b/code/game/gamemodes/changeling/powers/digitalcamo.dm
index 13bf62bdbc4..79651c98a97 100644
--- a/code/game/gamemodes/changeling/powers/digitalcamo.dm
+++ b/code/game/gamemodes/changeling/powers/digitalcamo.dm
@@ -18,3 +18,7 @@
feedback_add_details("changeling_powers","CAM")
return 1
+
+/obj/effect/proc_holder/changeling/digitalcamo/on_refund(mob/user)
+ user.digitalcamo = 0
+ user.digitalinvis = 0
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/humanform.dm b/code/game/gamemodes/changeling/powers/humanform.dm
index 04d36c169ac..5fde1238159 100644
--- a/code/game/gamemodes/changeling/powers/humanform.dm
+++ b/code/game/gamemodes/changeling/powers/humanform.dm
@@ -24,12 +24,11 @@
if(!user || user.notransform)
return 0
user << "We transform our appearance."
-
- user.humanize((TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPSRC), chosen_prof.name)
-
- changeling_transform(user, chosen_prof)
changeling.purchasedpowers -= src
+
+ var/newmob = user.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS)
+
+ changeling_transform(newmob, chosen_prof)
feedback_add_details("changeling_powers","LFT")
- qdel(user)
return 1
diff --git a/code/game/gamemodes/changeling/powers/lesserform.dm b/code/game/gamemodes/changeling/powers/lesserform.dm
index 2ce8470c19c..05406b02bdf 100644
--- a/code/game/gamemodes/changeling/powers/lesserform.dm
+++ b/code/game/gamemodes/changeling/powers/lesserform.dm
@@ -12,9 +12,7 @@
return 0
user << "Our genes cry out!"
- user.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPSE | TR_KEEPSRC)
+ user.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSE)
- // Human-form power now handled in monkeyize()
feedback_add_details("changeling_powers","LF")
- .=1
- qdel(user)
\ No newline at end of file
+ return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm
index 71e6512b68b..1efb76bef3c 100644
--- a/code/game/gamemodes/changeling/powers/mutations.dm
+++ b/code/game/gamemodes/changeling/powers/mutations.dm
@@ -21,20 +21,23 @@
var/weapon_name_simple
/obj/effect/proc_holder/changeling/weapon/try_to_sting(mob/user, mob/target)
- if(istype(user.l_hand, weapon_type)) //Not the nicest way to do it, but eh
- playsound(user, 'sound/effects/blobattack.ogg', 30, 1)
- qdel(user.l_hand)
- user.visible_message("With a sickening crunch, [user] reforms their [weapon_name_simple] into an arm!", "We assimilate the [weapon_name_simple] back into our body.", "With a sickening crunch, [user] reforms their [weapon_name_simple] into an arm!", "We assimilate the [weapon_name_simple] back into our body.", "With a sickening crunch, [user] reforms their [weapon_name_simple] into an arm!", "We assimilate the [weapon_name_simple] back into our body.", "The [user.get_active_hand()] is stuck to your hand, you cannot grow a [weapon_name_simple] over it!"
@@ -44,6 +47,10 @@
playsound(user, 'sound/effects/blobattack.ogg', 30, 1)
return W
+/obj/effect/proc_holder/changeling/weapon/on_refund(mob/user)
+ check_weapon(user, user.r_hand, 1)
+ check_weapon(user, user.l_hand, 0)
+
//Parent to space suits and armor.
/obj/effect/proc_holder/changeling/suit
name = "Organic Suit"
@@ -61,10 +68,16 @@
var/blood_on_castoff = 0
/obj/effect/proc_holder/changeling/suit/try_to_sting(mob/user, mob/target)
+ if(check_suit(user))
+ return
+ var/mob/living/carbon/human/H = user
+ ..(H, target)
+
+//checks if we already have an organic suit and casts it off.
+/obj/effect/proc_holder/changeling/suit/proc/check_suit(mob/user)
var/datum/changeling/changeling = user.mind.changeling
if(!ishuman(user) || !changeling)
- return
-
+ return 1
var/mob/living/carbon/human/H = user
if(istype(H.wear_suit, suit_type) || istype(H.head, helmet_type))
H.visible_message("[H] casts off their [suit_name_simple]!", "We cast off our [suit_name_simple][genetic_damage > 0 ? ", temporarily weakening our genomes." : "."]", "You hear the organic matter ripping and tearing!")
@@ -82,8 +95,13 @@
changeling.geneticdamage += genetic_damage //Casting off a space suit leaves you weak for a few seconds.
changeling.chem_recharge_slowdown -= recharge_slowdown
+ return 1
+
+/obj/effect/proc_holder/changeling/suit/on_refund(mob/user)
+ if(!ishuman(user))
return
- ..(H, target)
+ var/mob/living/carbon/human/H = user
+ check_suit(H)
/obj/effect/proc_holder/changeling/suit/sting_action(mob/living/carbon/human/user)
if(!user.canUnEquip(user.wear_suit))
diff --git a/code/game/gamemodes/changeling/powers/panacea.dm b/code/game/gamemodes/changeling/powers/panacea.dm
index 672d3b5f594..14f751ec5b4 100644
--- a/code/game/gamemodes/changeling/powers/panacea.dm
+++ b/code/game/gamemodes/changeling/powers/panacea.dm
@@ -15,6 +15,9 @@
for(var/datum/disease/D in user.viruses)
D.cure()
-
+ for(var/obj/item/organ/internal/I in user)
+ if(istype(I,/obj/item/organ/internal/body_egg/alien_embryo))
+ I.Remove(user)
+ I.loc = get_turf(user)
feedback_add_details("changeling_powers","AP")
return 1
diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm
index 5cd021fff74..a94ff6fc68e 100644
--- a/code/game/gamemodes/changeling/powers/tiny_prick.dm
+++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm
@@ -81,7 +81,7 @@
/obj/effect/proc_holder/changeling/sting/transformation/can_sting(mob/user, mob/target)
if(!..())
return
- if((target.disabilities & HUSK) || !check_dna_integrity(target))
+ if((target.disabilities & HUSK) || !target.has_dna())
user << "Our sting appears ineffective against its DNA."
return 0
return 1
@@ -92,15 +92,17 @@
if(ismonkey(target))
user << "Our genes cry out as we sting [target.name]!"
- if(iscarbon(target) && (target.status_flags & CANWEAKEN))
+ if(iscarbon(target))
var/mob/living/carbon/C = target
- C.do_jitter_animation(500)
- C.take_organ_damage(20, 0) //The process is extremely painful
+ if(C.status_flags & CANWEAKEN)
+ C.do_jitter_animation(500)
+ C.take_organ_damage(20, 0) //The process is extremely painful
- target.visible_message("[target] begins to violenty convulse!","You feel a tiny prick and a begin to uncontrollably convulse!")
- spawn(10)
- hardset_dna(target, NewDNA.uni_identity, NewDNA.struc_enzymes, NewDNA.real_name, NewDNA.blood_type, NewDNA.species.type, NewDNA.features)
- updateappearance(target)
+ target.visible_message("[target] begins to violenty convulse!","You feel a tiny prick and a begin to uncontrollably convulse!")
+ spawn(10)
+ NewDNA.transfer_identity(C, transfer_SE=1)
+ C.updateappearance(mutcolor_update=1)
+ C.domutcheck()
feedback_add_details("changeling_powers","TS")
return 1
@@ -125,7 +127,7 @@
/obj/effect/proc_holder/changeling/sting/false_armblade/can_sting(mob/user, mob/target)
if(!..())
return
- if((target.disabilities & HUSK) || !check_dna_integrity(target))
+ if((target.disabilities & HUSK) || !target.has_dna())
user << "Our sting appears ineffective against its DNA."
return 0
return 1
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index 9c3bf83d20c..eb56a644fb6 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -92,7 +92,8 @@
if(config.protect_assistant_from_antagonist)
restricted_jobs += "Assistant"
- acolytes_needed = max(2, round(num_players()/5)) //Scales the escape requirement with the amount of people in the round
+ acolytes_needed = round(num_players()/5,1) //Scales the escape requirement with the amount of people in the round; for every 5 players, one cultist added to the count, i.e. 25 players = 5 to escape
+ acolytes_needed = Clamp(acolytes_needed, 1, 15) //Max at 15 and minimum at 1 - before the update, people rarely got even 15
for(var/cultists_number = 1 to recommended_enemies)
if(!antag_candidates.len)
@@ -141,11 +142,11 @@
explanation = "Our knowledge must live on. Make sure at least [acolytes_needed] acolytes escape on the shuttle to spread their work on an another station."
if("sacrifice")
if(sacrifice_target)
- explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. You will need the Rite of Tribute and three acolytes to do so."
+ explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. You will need the Sacrifice rune and three acolytes to do so."
else
explanation = "Free objective."
if("eldergod")
- explanation = "Summon Nar-Sie via the use of the Ritual of Dimensional Rending. It will only work if nine cultists stand on and around it."
+ explanation = "Summon Nar-Sie via the rune 'Call Forth The Geometer'. It will only work if nine acolytes stand on and around it."
cult_mind.current << "Objective #[obj_count]: [explanation]"
cult_mind.memory += "Objective #[obj_count]: [explanation] "
@@ -171,7 +172,7 @@
if(!where)
mob << "Unfortunately, you weren't able to get a talisman. This is very bad and you should adminhelp immediately."
else
- mob << "You have a talisman in your [where], one that will help you start the cult on this station. Use it well, and remember - you are not the only one."
+ mob << "You have a talisman in your [where], one that will help you start the cult on this station. Use it well, and remember - you are not the only one."
mob.update_icons()
if(where == "backpack")
var/obj/item/weapon/storage/B = mob.back
@@ -203,13 +204,13 @@
cult -= cult_mind
cult_mind.current.verbs -= /mob/living/proc/cult_innate_comm
cult_mind.current.Paralyse(5)
- cult_mind.current << "An unfamiliar white light flashes through your mind, cleansing the taint of the dark-one and the memories of your time as his servant with it."
+ cult_mind.current << "An unfamiliar white light flashes through your mind, cleansing the taint of the Dark One and all your memories as its servant."
cult_mind.memory = ""
update_cult_icons_removed(cult_mind)
cult_mind.current.attack_log += "\[[time_stamp()]\] Has renounced the cult!"
if(show_message)
for(var/mob/M in viewers(cult_mind.current))
- M << "[cult_mind.current] looks like they just reverted to their old faith!"
+ M << "[cult_mind.current] looks like they just reverted to their old faith!"
/datum/game_mode/proc/update_cult_icons_added(datum/mind/cult_mind)
var/datum/atom_hud/antag/culthud = huds[ANTAG_HUD_CULT]
@@ -259,7 +260,7 @@
if(!check_cult_victory())
feedback_set_details("round_end_result","win - cult win")
feedback_set("round_end_result",acolytes_survived)
- world << "The cult wins! It has succeeded in serving its dark masters!"
+ world << "The cult wins! It has succeeded in serving its dark master!"
else
feedback_set_details("round_end_result","loss - staff stopped the cult")
feedback_set("round_end_result",acolytes_survived)
diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm
index 000120ef61a..33c36715fc3 100644
--- a/code/game/gamemodes/cult/ritual.dm
+++ b/code/game/gamemodes/cult/ritual.dm
@@ -138,83 +138,82 @@ It also contains rune words, which are soon to be removed.
Rite of Knowledge: \"karazet nahlizet ego\" \
"*/
- text += "Rite of Translocation The Rite of Translocation is a unique rite in that it requires a keyword before the scribing can begin. When invoked, the rune will \
+ text += "Teleport The Rite of Translocation is a unique rite in that it requires a keyword before the scribing can begin. When invoked, the rune will \
search for other Rites of Translocation with the same keyword. Assuming one is found, the user will be instantaneously transported to the location of the other rune. If more than two runes are scribed \
with the same keyword, it will choose randomly between all eligible runes and send the invoker to one of them.
"
- text += "Rite of Forced Translocation The Rite of Forced Translocation, like the Rite of Translocation, works by teleporting the person on the rune to one of the \
+ text += "Teleport Other The Rite of Forced Translocation, like the Rite of Translocation, works by teleporting the person on the rune to one of the \
same keyword. However, this rune will only work on people other than the user, allowing the user to send any living creature somewhere else.
"
- text += "Rite of Knowledge The Rite of Knowledge is a simplistic rune. When invoked, it will summon a single arcane tome to the rune's location before vanishing. \
+ text += "Summon Tome The Rite of Knowledge is a simplistic rune. When invoked, it will summon a single arcane tome to the rune's location before vanishing. \
"
- text += "Rite of Enlightenment The Rite of Enlightment is paramount to the success of the cult. It will allow you to convert normal crew members into cultists. \
- To do this, simply place the crew member upon the rune and invoke it. This may take some time, depending on the amount of cultists nearby. It takes twenty seconds, with each additional cultist shaving \
- off ten seconds of the conversion. With three or more cultists, conversion is instantaneous. Once invoked, only the original user must remain. If the target is loyalty-implanted or has a null rod in \
- their possession, this will not work.
"
+ text += "Convert The Rite of Enlightment is paramount to the success of the cult. It will allow you to convert normal crew members into cultists. \
+ To do this, simply place the crew member upon the rune and invoke it. This rune requires two acolytes to use. If the target to be converted is loyalty-implanted or a certain assignment, they will \
+ be unable to be converted. People the Geometer wishes sacrificed will also be ineligible for conversion, and anyone with a shielding presence like a null rod will not be converted.
"
- text += "Rite of Tribute The Rite of Tribute is used to offer sacrifice to the Geometer. Simply place any living creature upon the rune and invoke it (this will not \
+ text += "Sacrifice The Rite of Tribute is used to offer sacrifice to the Geometer. Simply place any living creature upon the rune and invoke it (this will not \
target cultists!). If this creature has a mind, a soul shard will be created and the creature's soul transported to it. This rune is required if the cult's objectives include the sacrifice of a crew \
member.
"
- text += "Rite of Resurrection The Rite of Resurrection is a delicate rite that requires two corpses. To perform the ritual, place the corpse you wish to revive onto \
+ text += "Raise Dead The Rite of Resurrection is a delicate rite that requires two corpses. To perform the ritual, place the corpse you wish to revive onto \
the rune and the offering body adjacent to it. When the rune is invoked, the body to be sacrificed will turn to ashes, the life force flowing into the revival target. Assuming the target is not moved \
within a few seconds, they will be brought back to life, healed of all ailments.
"
- text += "Rite of Obscurity The Rite of Obscurity is a rite that will cause all nearby runes to become invisible. The runes will still be considered by other rites \
+ text += "Veil Runes The Rite of Obscurity is a rite that will cause all nearby runes to become invisible. The runes will still be considered by other rites \
(such as the Rite of Translocation) but is unusuable directly.
"
- text += "Rite of True Sight The Rite of True Sight is the foil of the Rite of Obscurity. It will turn all invisible runes visible once more, in addition to causing \
+ text += "Reveal Runes The Rite of True Sight is the foil of the Rite of Obscurity. It will turn all invisible runes visible once more, in addition to causing \
all spirits nearby to become partially corporeal.
"
- text += "Rite of False Truths Many crew men enjoy drawing runes in crayon that resemble spell circles in order to play pranks on their fellow crewmen. The Rite of \
+ text += "Disguise Runes Many crew men enjoy drawing runes in crayon that resemble spell circles in order to play pranks on their fellow crewmen. The Rite of \
False Truths takes advantage of this very joke. When invoked, all nearby runes will appear dull, precisely resembling those drawn in crayon. They still cannot be cleaned by conventional means, so \
anyone trying to clean up the rune may become suspicious as it does not respond.
"
- text += "Rite of Disruption Robotic lifeforms have time and time again been the downfall of fledgling cults. The Rite of Disruption may allow you to gain the upper \
+ text += "Electromagnetic Disruption Robotic lifeforms have time and time again been the downfall of fledgling cults. The Rite of Disruption may allow you to gain the upper \
hand against these pests. By using the rune, a large electromagnetic pulse will be emitted from the rune's location.
"
- text += "Rite of Astral Communion The Rite of Astral Communion is perhaps the most ingenious rune that is usable by a single person. Upon invoking the rune, the \
+ text += "Astral Communion The Rite of Astral Communion is perhaps the most ingenious rune that is usable by a single person. Upon invoking the rune, the \
user's spirit will be ripped from their body. In this state, the user's physical body will be locked in place to the rune itself - any attempts to move it will result in the rune pulling it back. \
The body will also take constant damage while in this form, and may even die. The user's spirit will contain their consciousness, and will allow them to freely wander the station as a ghost. This may \
also be used to commune with the dead.
"
- text += "Rite of the Corporeal Shield While simple, the Rite of the Corporeal Shield serves an important purpose in defense and hindering passage. When invoked, the \
+ text += "Form Shield While simple, the Rite of the Corporeal Shield serves an important purpose in defense and hindering passage. When invoked, the \
rune will draw a small amount of life force from the user and make the space above the rune completely dense, rendering it impassable to all but the most complex means. The rune may be invoked again to \
undo this effect and allow passage again.
"
- text += "Rite of the Unheard Whisper The Rite of the Unheard Whisper is simple. When invoked, it will cause all non-cultists within a radius of seven tiles to become \
+ text += "Deafen The Rite of the Unheard Whisper is simple. When invoked, it will cause all non-cultists within a radius of seven tiles to become \
completely deaf for a large amount of time.
"
- text += "Rite of the Unseen Glance Much like the Rite of the Unheard Whisper, the Rite of the Unseen Glance serves a single purpose. Any non-cultists who can see \
+ text += "Blind Much like the Rite of the Unheard Whisper, the Rite of the Unseen Glance serves a single purpose. Any non-cultists who can see \
the rune will instantly be blinded for a substantial amount of time.
"
- text += "Rite of Disorientation A somewhat empowered version of the Rite of the Unseen Glance, this rune will cause any non-cultists that can see the rune to become \
+ text += "Stun A somewhat empowered version of the Rite of the Unseen Glance, this rune will cause any non-cultists that can see the rune to become \
disoriented, disabling them for a short time.
"
- text += "Rite of Joined Souls The Rite of Joined Souls requires two acolytes to use. When invoked, it will allow the user to summon a single cultist to the rune from \
+ text += "Summon Cultist The Rite of Joined Souls requires two acolytes to use. When invoked, it will allow the user to summon a single cultist to the rune from \
any location. This will deal a moderate amount of damage to all invokers.
"
- text += "Rite of Binding The Rite of Binding is the only way to create talismans. A blank sheet of paper must be on top of the rune, with a valid rune nearby. After \
+ text += "Imbue Talisman The Rite of Binding is the only way to create talismans. A blank sheet of paper must be on top of the rune, with a valid rune nearby. After \
invoking it, the paper will be converted into a talisman, and the rune inlaid upon it.
"
- text += "Rite of Fabrication The Rite of Fabrication is the main way of creating construct shells. To use it, one must place five sheets of plasteel on top of the rune \
+ text += "Fabricate Shell The Rite of Fabrication is the main way of creating construct shells. To use it, one must place five sheets of plasteel on top of the rune \
and invoke it. The sheets will them be twisted into a construct shell, ready to recieve a soul to occupy it.
"
- text += "Rite of Arming The Rite of Arming will equip the user with invoker's robes, a backpack, a Nar-Sian longsword, and a pair of boots. Any items that cannot \
+ text += "Summon Arnaments The Rite of Arming will equip the user with invoker's robes, a backpack, a Nar-Sian longsword, and a pair of boots. Any items that cannot \
be equipped will instead not be summoned regardless.
"
- text += "Rite of Leeching The Rite of Leeching will drain the life of any non-cultist above the rune and heal the invoker for the same amount.
"
+ text += "Drain Life The Rite of Leeching will drain the life of any non-cultist above the rune and heal the invoker for the same amount.
"
- text += "Rite of Boiling Blood The Rite of Boiling Blood may be considered one of the most dangerous rites composed by the Nar-Sian cult. When invoked, it will do a \
+ text += "Boil Blood The Rite of Boiling Blood may be considered one of the most dangerous rites composed by the Nar-Sian cult. When invoked, it will do a \
massive amount of damage to all non-cultist viewers, but it will also emit an explosion upon invocation. Use with caution
"
- text += "Rite of Spectral Manifestation If you wish to bring a spirit back from the dead with a wish for vengeance and desire to serve, the Rite of Spectral \
+ text += "Manifest Spirit If you wish to bring a spirit back from the dead with a wish for vengeance and desire to serve, the Rite of Spectral \
Manifestation can do just that. When invoked, any spirits above the rune will be brought to life as a human wearing nothing that seeks only to serve you and the Geometer. However, the spirit's link \
to reality is fragile - you must remain on top of the rune, and you will slowly take damage. Upon stepping off the rune, the spirits will dissipate, dropping their items to the ground. You may manifest \
multiple spirits with one rune, but you will rapidly take damage in doing so.
"
- text += "Ritual of Dimensional Rending There is only one way to summon the avatar of Nar-Sie, and that is the Ritual of Dimensional Rending. This ritual, in \
+ text += "Call Forth The Geometer There is only one way to summon the avatar of Nar-Sie, and that is the Ritual of Dimensional Rending. This ritual, in \
comparison to other runes, is very large, requiring a 3x3 space of empty tiles to create. To invoke the rune, nine cultists must stand on the rune, so that all of them are within its circle. Then, \
simply invoke it. A brief tearing will be heard as the barrier between dimensions is torn open, and the avatar will come forth.
"
@@ -222,17 +221,17 @@ It also contains rune words, which are soon to be removed.
rune inlaid within it. The words of the rune can be whispered in order to invoke its effects, although usually to a lesser extent. To create a talisman, simply use a Rite of Binding as described above. \
Unless stated otherwise, talismans are invoked by activating them in your hand. A list of valid rites, as well as the effects of their talisman form, can be found below.
"
- text += "Talisman of Translocation The talisman form of the Rite of Translocation will transport the invoker to a randomly chosen rune of the same keyword, then \
+ text += "Talisman of Teleportation The talisman form of the Rite of Translocation will transport the invoker to a randomly chosen rune of the same keyword, then \
disappear.
"
- text += "Talisman of Knowledge This talisman functions identically to the rune. It can be used once, then disappears.
"
+ text += "Talisman of Tome summoning This talisman functions identically to the rune. It can be used once, then disappears.
"
- text += "Talismans of Obscurity, True Sight, and False Truths These talismans all function identically to their rune counterparts, but with less range. In addition, \
+ text += "Talismans of Veiling, Revealing, and Disguising These talismans all function identically to their rune counterparts, but with less range. In addition, \
the Talisman of True Sight will not reveal spirits. They will disappear after one use.
"
- text += "Talisman of Disruption This talisman functions like the Rite of Disruption, but with halved range. It disappears after one use.
"
+ text += "Talisman of Electromagnets This talisman functions like the Rite of Disruption. It disappears after one use.
"
- text += "Talisman of Disorientation Without this talisman, the cult would have no way of easily acquiring targets to convert. Commonly called \"stunpapers\", this \
+ text += "Talisman of Stunning Without this talisman, the cult would have no way of easily acquiring targets to convert. Commonly called \"stunpapers\", this \
talisman functions differently from others. Rather than simply reading the words, the target must be attacked directly with the talisman. The talisman will then knock down the target for a long \
duration in addition to rendering them incapable of speech. Robotic lifeforms will suffer the effects of a heavy electromagnetic pulse instead."
@@ -269,7 +268,7 @@ It also contains rune words, which are soon to be removed.
"You slice open your arm and begin drawing a sigil of the Geometer.")
if(iscarbon(user))
var/mob/living/carbon/C = user
- C.apply_damage(1, BRUTE, pick("l_arm", "r_arm"))
+ C.apply_damage(0.1, BRUTE, pick("l_arm", "r_arm"))
if(!do_after(user, 50, target = get_turf(user)))
return
user.visible_message("[user] creates a strange circle in their own blood.", \
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index 7ee742718c1..d9ce858c153 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -171,7 +171,7 @@ structure_check() searches for nearby cultist structures required for the invoca
var/list/teleport_runes = list()
//Rite of Translocation: Warps the user to a random teleport rune with the same keyword.
/obj/effect/rune/teleport
- cultist_name = "Rite of Translocation"
+ cultist_name = "Teleport"
cultist_desc = "Warps the user to a random rune of the same keyword."
invocation = "Sas'so c'arta forbici!"
icon_state = "2"
@@ -210,7 +210,7 @@ var/list/teleport_runes = list()
var/list/teleport_other_runes = list()
//Rite of Forced Translocation: Warps the target to a random teleport rune with the same keyword.
/obj/effect/rune/teleport_other
- cultist_name = "Rite of Forced Translocation"
+ cultist_name = "Teleport Other"
cultist_desc = "Warps the target to a random rune of the same keyword."
invocation = "Sas'so c'arta forbica!"
icon_state = "1"
@@ -266,8 +266,8 @@ var/list/teleport_other_runes = list()
//Rite of Knowledge: Creates an arcane tome at the rune's location and destroys the rune.
/obj/effect/rune/summon_tome
- cultist_name = "Rite of Knowledge"
- cultist_desc = "Pulls an unstranslated arcane tome from the archives of the Geometer."
+ cultist_name = "Summon Tome"
+ cultist_desc = "Pulls an arcane tome from the archives of the Geometer."
invocation = "N'ath reth sh'yro eth d'raggathnor!"
icon_state = "5"
color = rgb(0, 0, 255)
@@ -281,12 +281,13 @@ var/list/teleport_other_runes = list()
//Rite of Enlightenment: Converts a normal crewmember to the cult. Faster for every cultist nearby.
/obj/effect/rune/convert
- cultist_name = "Rite of Enlightenment"
+ cultist_name = "Convert"
cultist_desc = "Converts a normal crewmember on top of it to the cult. Does not work on loyalty-implanted crew."
invocation = "Mah'weyh pleggh at e'ntrath!"
icon_state = "3"
color = rgb(255, 0, 0)
grammar = "certum nahlizet ego"
+ req_cultists = 2
/obj/effect/rune/convert/invoke(mob/living/user)
var/list/convertees = list()
@@ -308,31 +309,6 @@ var/list/teleport_other_runes = list()
if(iscultist(M))
M << "\"I desire this one for myself. SACRIFICE THEM!\""
return
- var/time = 300
- for(var/mob/living/M in orange(1,src))
- if(iscultist(M))
- time -= 100
- time = Clamp(time, 0, 300)
- if(time)
- visible_message("[src] begins to glow with a sinister light...")
- for(var/mob/living/M in orange(1,src))
- if(iscultist(M))
- if(M != user)
- M << "You have aided [user] in invoking the [cultist_name]. You may now safely depart."
- else
- M << "You begin the enlightenment of [new_cultist]. This will take [time / 10] seconds and you must stand still."
- new_cultist << "Your head begins to ache..."
- if(!do_mob(user, new_cultist, time))
- visible_message("[src] reluctantly falls dark.")
- new_cultist << "Your headache fades."
- return
- if(is_sacrifice_target(new_cultist.mind))
- for(var/mob/living/M in orange(1,src))
- if(iscultist(M))
- M << "\"I desire this one for myself. SACRIFICE THEM!\""
- fail_invoke()
- log_game("Convert rune failed - convertee is sacrifice target")
- return
new_cultist.visible_message("[new_cultist] writhes in pain as the markings below them glow a bloody red!", \
"AAAAAAAAAAAAAA-")
ticker.mode.add_cultist(new_cultist.mind)
@@ -345,14 +321,18 @@ var/list/teleport_other_runes = list()
//Rite of Tribute: Sacrifices a crew member to Nar-Sie. Places them into a soul shard if they're in their body.
/obj/effect/rune/sacrifice
- cultist_name = "Rite of Tribute"
+ cultist_name = "Sacrifice"
cultist_desc = "Sacrifices a crew member to the Geometer. May place them into a soul shard if their spirit remains in their body."
icon_state = "3"
- invocation = "Barhah hra zar'garis!"
+ invocation = "Ih wah'kd in teh'tin!"
color = rgb(255, 255, 255)
grammar = "veri nahlizet certum"
var/rune_in_use = 0
+/obj/effect/rune/sacrifice/New()
+ ..()
+ icon_state = "[rand(1,6)]"
+
/obj/effect/rune/sacrifice/invoke(mob/living/user)
if(rune_in_use)
return
@@ -397,28 +377,16 @@ var/list/teleport_other_runes = list()
/obj/effect/rune/sacrifice/proc/sac(mob/living/T)
var/sacrifice_fulfilled
if(T)
- if(T.mind)
- var/obj/item/device/soulstone/stone = new /obj/item/device/soulstone(get_turf(src))
- if(!stone.transfer_soul("FORCE", T, usr)) //If it cannot be added
- qdel(stone)
- if(!T)
- rune_in_use = 0
- return
if(istype(T, /mob/living/simple_animal/pet/dog/corgi))
for(var/mob/living/carbon/C in orange(1,src))
if(iscultist(C))
C << "Even dark gods from another plane have standards, sicko."
if(C.reagents)
C.reagents.add_reagent("hell_water", 2)
- sacrificed.Add(T.mind)
- if(is_sacrifice_target(T.mind))
- sacrifice_fulfilled = 1
- if(isrobot(T))
- playsound(T, 'sound/magic/Disable_Tech.ogg', 100, 1)
- T.dust() //To prevent the MMI from remaining
- else
- playsound(T, 'sound/magic/Disintegrate.ogg', 100, 1)
- T.gib()
+ if(T.mind)
+ sacrificed.Add(T.mind)
+ if(is_sacrifice_target(T.mind))
+ sacrifice_fulfilled = 1
for(var/mob/living/M in orange(1,src))
if(iscultist(M))
if(sacrifice_fulfilled)
@@ -428,12 +396,25 @@ var/list/teleport_other_runes = list()
M << "\"I accept this sacrifice.\""
else
M << "\"I accept this meager sacrifice.\""
+ if(T.mind)
+ var/obj/item/device/soulstone/stone = new /obj/item/device/soulstone(get_turf(src))
+ if(!stone.transfer_soul("FORCE", T, usr)) //If it cannot be added
+ qdel(stone)
+ if(!T)
+ rune_in_use = 0
+ return
+ if(isrobot(T))
+ playsound(T, 'sound/magic/Disable_Tech.ogg', 100, 1)
+ T.dust() //To prevent the MMI from remaining
+ else
+ playsound(T, 'sound/magic/Disintegrate.ogg', 100, 1)
+ T.gib()
rune_in_use = 0
//Ritual of Dimensional Rending: Calls forth the avatar of Nar-Sie upon the station.
/obj/effect/rune/narsie
- cultist_name = "Ritual of Dimensional Rending"
+ cultist_name = "Call Forth The Geometer"
cultist_desc = "Tears apart dimensional barriers, calling forth the avatar of the Geometer."
invocation = "Tok-lyr rqa'nap g'olt-ulotf!"
req_cultists = 9
@@ -489,10 +470,11 @@ var/list/teleport_other_runes = list()
//Rite of Resurrection: Requires two corpses. Revives one and gibs the other.
/obj/effect/rune/raise_dead
- cultist_name = "Rite of Resurrection"
+ cultist_name = "Raise Dead"
cultist_desc = "Requires two corpses. The one placed upon the rune is brought to life, the other is turned to ash."
invocation = null //Depends on the name of the user - see below
- color = rgb(150, 0, 0)
+ icon_state = "1"
+ color = rgb(255, 0, 0)
grammar = "nahlizet certum veri"
/obj/effect/rune/raise_dead/invoke(mob/living/user)
@@ -557,11 +539,11 @@ var/list/teleport_other_runes = list()
//Rite of Obscurity: Turns all runes within a 3-tile radius invisible.
/obj/effect/rune/hide_runes
- cultist_name = "Rite of Obscurity"
- cultist_desc = "Turns nearby runes invisible. They can be revealed by using the Rite of True Sight."
+ cultist_name = "Veil Runes"
+ cultist_desc = "Turns nearby runes invisible. They can be revealed by using the Reveal Runes rune."
invocation = "Kla'atu barada nikt'o!"
- icon_state = "3"
- color = rgb(255,255,255)
+ icon_state = "1"
+ color = rgb(0,0,255)
grammar = "geeri karazet nahlizet"
/obj/effect/rune/hide_runes/invoke(mob/living/user)
@@ -579,11 +561,11 @@ var/list/teleport_other_runes = list()
//Rite of True Sight: Turns ghosts and obscured runes visible
/obj/effect/rune/true_sight
- cultist_name = "Rite of True Sight"
+ cultist_name = "Reveal Runes"
cultist_desc = "Reveals all invisible objects nearby, from spirits to runes."
invocation = "Nikt'o barada kla'atu!"
- icon_state = "6"
- color = rgb(255, 162, 33)
+ icon_state = "4"
+ color = rgb(255, 255, 255)
grammar = "karazet geeri nahlizet"
/obj/effect/rune/true_sight/invoke()
@@ -599,7 +581,7 @@ var/list/teleport_other_runes = list()
//Rite of False Truths: Makes runes appear like crayon ones
/obj/effect/rune/make_runes_fake
- cultist_name = "Rite of False Truths"
+ cultist_name = "Disguise Runes"
cultist_desc = "Causes all nearby runes (including itself) to resemble those drawn in crayon."
invocation = "By'o isit!"
icon_state = "4"
@@ -614,11 +596,11 @@ var/list/teleport_other_runes = list()
//Rite of Disruption: Emits an EMP blast.
/obj/effect/rune/emp
- cultist_name = "Rite of Disruption"
+ cultist_name = "Electromagnetic Disruption"
cultist_desc = "Emits a large electromagnetic pulse, hindering electronics and disabling silicons."
invocation = "Ta'gh fara'qha fel d'amar det!"
- icon_state = "1"
- color = rgb(0, 0, 255)
+ icon_state = "5"
+ color = rgb(255, 0, 0)
grammar = "mgar karazet balaq"
/obj/effect/rune/emp/invoke(mob/living/user)
@@ -632,11 +614,11 @@ var/list/teleport_other_runes = list()
//Rite of Astral Communion: Separates one's spirit from their body. They will take damage while it is active.
/obj/effect/rune/astral
- cultist_name = "Rite of Astral Communion"
+ cultist_name = "Astral Communion"
cultist_desc = "Severs the link between one's spirit and body. This effect is taxing and one's physical body will take damage while this is active."
invocation = "Fwe'sh mah erl nyag r'ya!"
- icon_state = "1"
- color = rgb(68, 47, 255)
+ icon_state = "6"
+ color = rgb(0, 0, 255)
var/rune_in_use = 0 //One at a time, please!
var/mob/living/affecting = null
grammar = "veri ire ego"
@@ -702,10 +684,11 @@ var/list/teleport_other_runes = list()
//Rite of the Corporeal Shield: When invoked, becomes solid and cannot be passed. Invoke again to undo.
/obj/effect/rune/wall
- cultist_name = "Rite of the Corporeal Shield"
+ cultist_name = "Form Shield"
cultist_desc = "When invoked, makes the rune block passage. Can be invoked again to reverse this."
invocation = "Khari'd! Eske'te tannin!"
icon_state = "1"
+ color = rgb(255, 0, 0)
grammar = "mgar ire ego"
/obj/effect/rune/wall/examine(mob/user)
@@ -724,10 +707,12 @@ var/list/teleport_other_runes = list()
//Rite of the Unheard Whisper: Deafens all non-cultists nearby.
/obj/effect/rune/deafen
- cultist_name = "Rite of the Unheard Whisper"
+ cultist_name = "Deafen"
cultist_desc = "Causes all non-followers nearby to lose their hearing."
invocation = "Sti kaliedir!"
grammar = "geeri jatkaa karazet"
+ color = rgb(0, 255, 0)
+ icon_state = "4"
/obj/effect/rune/deafen/invoke(mob/living/user)
visible_message("[src] blurs for a moment before fading away.")
@@ -740,11 +725,11 @@ var/list/teleport_other_runes = list()
//Rite of the Unseen Glance: Blinds all non-cultists nearby.
/obj/effect/rune/blind
- cultist_name = "Rite of the Unseen Glance"
+ cultist_name = "Blind"
cultist_desc = "Causes all non-followers nearby to lose their sight."
invocation = "Sti kaliesin!"
- icon_state = "1"
- color = rgb(0, 255, 0)
+ icon_state = "4"
+ color = rgb(0, 0, 255)
grammar = "mgar jatkaa karazet"
/obj/effect/rune/blind/invoke(mob/living/user)
@@ -760,11 +745,11 @@ var/list/teleport_other_runes = list()
//Rite of Disorientation: Stuns all non-cultists nearby for a brief time
/obj/effect/rune/stun
- cultist_name = "Rite of Disorientation"
+ cultist_name = "Stun"
cultist_desc = "Stuns all nearby non-followers for a brief time."
invocation = "Fuu ma'jin!"
icon_state = "2"
- color = rgb(150, 0, 255)
+ color = rgb(100, 0, 100)
grammar = "certum geeri balaq"
/obj/effect/rune/stun/invoke(mob/living/user)
@@ -780,7 +765,7 @@ var/list/teleport_other_runes = list()
//Rite of Joined Souls: Summons a single cultist. Requires 2 cultists.
/obj/effect/rune/summon
- cultist_name = "Rite of Joined Souls"
+ cultist_name = "Summon Cultist"
cultist_desc = "Summons a single cultist to the rune."
invocation = "N'ath reth sh'yro eth d'rekkathnor!"
req_cultists = 2
@@ -817,11 +802,11 @@ var/list/teleport_other_runes = list()
//Rite of Binding: Turns a nearby rune and a paper on top of the rune to a talisman, if both are valid.
/obj/effect/rune/imbue
- cultist_name = "Rite of Binding"
+ cultist_name = "Bind Talisman"
cultist_desc = "Transforms papers and valid runes into talismans."
invocation = "H'drak v'loso, mir'kanas verbot!"
icon_state = "3"
- color = rgb(150, 0, 255)
+ color = rgb(0, 0, 255)
grammar = "veri balaq certum"
/obj/effect/rune/imbue/invoke(mob/living/user)
@@ -860,18 +845,13 @@ var/list/teleport_other_runes = list()
log_game("Talisman Imbue rune failed - chosen rune invalid")
return
visible_message("[picked_rune] crumbles to dust, and bloody images form themselves on [paper_to_imbue].")
- if(iscarbon(user))
- var/mob/living/carbon/C = user
- C.apply_damage(5, BRUTE, pick("l_arm", "r_arm"))
- else
- user.adjustBruteLoss(5)
qdel(paper_to_imbue)
qdel(picked_rune)
//Rite of Fabrication: Creates a construct shell out of 5 metal sheets.
/obj/effect/rune/construct_shell
- cultist_name = "Rite of Fabrication"
+ cultist_name = "Fabricate Shell"
cultist_desc = "Turns five plasteel sheets into an empty construct shell, suitable for containing a soul shard."
invocation = "Ethra p'ni dedol!"
icon_state = "5"
@@ -900,7 +880,7 @@ var/list/teleport_other_runes = list()
//Rite of Arming: Creates cult robes, a trophy rack, and a cult sword on the rune.
/obj/effect/rune/armor
- cultist_name = "Rite of Arming"
+ cultist_name = "Summon Arnaments"
cultist_desc = "Equips the user with robes, shoes, a backpack, and a longsword. Items that cannot be equipped will not be summoned."
invocation = "N'ath reth sh'yro eth draggathnor!"
icon_state = "4"
@@ -919,7 +899,7 @@ var/list/teleport_other_runes = list()
//Rite of Leeching: Deals brute damage to the target and heals the same amount to the invoker.
/obj/effect/rune/leeching
- cultist_name = "Rite of Leeching"
+ cultist_name = "Drain Life"
cultist_desc = "Drains the life of the target on the rune, restoring it to the user."
invocation = "Yu'gular faras desdae. Havas mithum javara. Umathar uf'kal thenar!" //that's a mouthful
icon_state = "2"
@@ -948,7 +928,7 @@ var/list/teleport_other_runes = list()
//Rite of Boiling Blood: Deals extremely high amounts of damage to non-cultists nearby
/obj/effect/rune/blood_boil
- cultist_name = "Rite of Boiling Blood"
+ cultist_name = "Boil Blood"
cultist_desc = "Boils the blood of non-believers who can see the rune, dealing extreme amounts of damage."
invocation = "Dedo ol'btoh!"
icon_state = "4"
@@ -975,7 +955,7 @@ var/list/teleport_other_runes = list()
//Rite of Spectral Manifestation: Summons a ghost on top of the rune as a cultist human with no items. User must stand on the rune at all times, and takes damage for each summoned ghost.
/obj/effect/rune/manifest
- cultist_name = "Rite of Spectral Manifestation"
+ cultist_name = "Manifest Spirit"
cultist_desc = "Manifests a spirit as a servant of the Geometer. The invoker must not move from atop the rune, and will take damage for each summoned spirit."
invocation = "Gal'h'rfikk harfrandid mud'gib!" //how the fuck do you pronounce this
icon_state = "6"
diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm
index 2a63281e1fb..bebcf0f2bdc 100644
--- a/code/game/gamemodes/cult/talisman.dm
+++ b/code/game/gamemodes/cult/talisman.dm
@@ -19,6 +19,7 @@ Rite of Disorientation
var/cultist_desc = "A basic talisman. It serves no purpose."
var/invocation = "Naise meam!"
var/uses = 1
+ var/health_cost = 0 //The amount of health taken from the user when invoking the talisman
/obj/item/weapon/paper/talisman/examine(mob/user)
..()
@@ -40,7 +41,9 @@ Rite of Disorientation
qdel(src)
/obj/item/weapon/paper/talisman/proc/invoke(mob/living/user)
-
+ if(health_cost && iscarbon(user))
+ var/mob/living/carbon/C = user
+ C.apply_damage(health_cost, BRUTE, pick("l_arm", "r_arm"))
//Malformed Talisman: If something goes wrong.
/obj/item/weapon/paper/talisman/malformed
@@ -124,9 +127,10 @@ Rite of Disorientation
//Rite of Translocation: Same as rune
/obj/item/weapon/paper/talisman/teleport
- cultist_name = "Rite of Translocation"
+ cultist_name = "Talisman of Teleportation"
cultist_desc = "A single-use talisman that will teleport a user to a random rune of the same keyword."
invocation = "Sas'so c'arta forbici!"
+ health_cost = 5
var/keyword = "ire"
/obj/item/weapon/paper/talisman/teleport/invoke(mob/living/user)
@@ -135,7 +139,7 @@ Rite of Disorientation
if(R.keyword == src.keyword)
possible_runes.Add(R)
if(!possible_runes.len)
- user << "There are no Rites of Translocation with the same keyword!"
+ user << "There are no Teleport runes with the same keyword!"
log_game("Teleportation talisman failed - no teleport runes of the same keyword")
uses++ //To prevent deletion
return
@@ -151,12 +155,18 @@ Rite of Disorientation
spawn(1) //To give the keyword time to change from the imbue rune
info += keyword
+/obj/item/weapon/paper/talisman/teleport/examine(mob/user)
+ ..()
+ if(iscultist(user) && keyword)
+ user << "Keyword: [keyword]"
+
//Rite of Knowledge: Same as rune, but has two uses
/obj/item/weapon/paper/talisman/summon_tome
- cultist_name = "Rite of Knowledge"
+ cultist_name = "Talisman of Tome Summoning"
cultist_desc = "A two-use talisman that will call untranslated tomes from the archives of the Geometer."
invocation = "N'ath reth sh'yro eth d'raggathnor!"
+ health_cost = 1
/obj/item/weapon/paper/talisman/summon_tome/invoke(mob/living/user)
user.visible_message("Dust flows from [user]'s hand for a moment.", \
@@ -171,9 +181,10 @@ Rite of Disorientation
//Rite of Obscurity: Same as rune, but less range
/obj/item/weapon/paper/talisman/hide_runes
- cultist_name = "Rite of Obscurity"
+ cultist_name = "Talisman of Veiling"
cultist_desc = "A talisman that will make all runes within a small radius invisible."
invocation = "Kla'atu barada nikt'o!"
+ health_cost = 1
/obj/item/weapon/paper/talisman/hide_runes/invoke(mob/living/user)
user.visible_message("Dust flows from [user]'s hand.", \
@@ -185,9 +196,10 @@ Rite of Disorientation
//Rite of True Sight: Same as rune, but doesn't work on ghosts
/obj/item/weapon/paper/talisman/true_sight
- cultist_name = "Rite of True Sight"
+ cultist_name = "Talisman of Revealing"
cultist_desc = "A talisman that reveals nearby invisible runes."
invocation = "Nikt'o barada kla'atu!"
+ health_cost = 1
/obj/item/weapon/paper/talisman/true_sight/invoke(mob/living/user)
user.visible_message("A flash of light shines from [user]'s hand!", \
@@ -198,9 +210,10 @@ Rite of Disorientation
//Rite of False Truths: Same as rune
/obj/item/weapon/paper/talisman/make_runes_fake
- cultist_name = "Rite of False Truths"
+ cultist_name = "Talisman of Disguising"
cultist_desc = "A talisman that will make nearby runes appear fake."
invocation = "By'o isit!"
+ health_cost = 3
/obj/item/weapon/paper/talisman/make_runes_fake/invoke(mob/living/user)
user.visible_message("Dust flows from [user]s hand.", \
@@ -211,21 +224,23 @@ Rite of Disorientation
//Rite of Disruption: Same as rune, halved radius
/obj/item/weapon/paper/talisman/emp
- cultist_name = "Rite of Disruption"
+ cultist_name = "Talisman of Electromagnets"
cultist_desc = "A talisman that will cause a moderately-sized electromagnetic pulse."
invocation = "Ta'gh fara'qha fel d'amar det!"
+ health_cost = 5
/obj/item/weapon/paper/talisman/emp/invoke(mob/living/user)
- user.visible_message("[user]'s hand glows a bright blue!", \
+ user.visible_message("[user]'s hand flashes a bright blue!", \
"You speak the words of the talisman, emitting an EMP blast.")
- empulse(src, 2, 4)
+ empulse(src, 4, 8)
//Rite of Disorientation: Stuns and mutes a single target for quite some time
/obj/item/weapon/paper/talisman/stun
- cultist_name = "Rite of Disorientation"
+ cultist_name = "Talisman of Stunning"
cultist_desc = "A talisman that will stun and mute a single target. To use, attack target directly."
invocation = "Fuu ma'jin!"
+ health_cost = 10 //A lot of health because of how powerful this is
/obj/item/weapon/paper/talisman/stun/attack_self(mob/living/user)
user << "To use this talisman, attack the target directly."
@@ -254,3 +269,20 @@ Rite of Disorientation
qdel(src)
return
..()
+
+
+//Rite of Arming: Equips cultist armor on the user, where available
+/obj/item/weapon/paper/talisman/armor
+ cultist_name = "Talisman of Arming"
+ cultist_desc = "A talisman that will equip the invoker with cultist equipment where available."
+ invocation = "N'ath reth sh'yro eth draggathnor!"
+ health_cost = 3
+
+/obj/item/weapon/paper/talisman/armor/invoke(mob/living/user)
+ user.visible_message("Otherworldy objects suddenly appear on [user]!", \
+ "You speak the words of the talisman, arming yourself!")
+ user.equip_to_slot_or_del(new /obj/item/clothing/head/culthood/alt(user), slot_head)
+ user.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(user), slot_wear_suit)
+ user.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult/alt(user), slot_shoes)
+ user.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/cultpack(user), slot_back)
+ user.put_in_hands(new /obj/item/weapon/melee/cultblade(user))
diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm
index a16b2946415..e3ce3bf5ea1 100644
--- a/code/game/gamemodes/nuclear/pinpointer.dm
+++ b/code/game/gamemodes/nuclear/pinpointer.dm
@@ -147,11 +147,11 @@
var/DNAstring = input("Input DNA string to search for." , "Please Enter String." , "")
if(!DNAstring)
return
- for(var/mob/living/carbon/M in mob_list)
- if(!M.dna)
+ for(var/mob/living/carbon/C in mob_list)
+ if(!C.dna)
continue
- if(M.dna.unique_enzymes == DNAstring)
- target = M
+ if(C.dna.unique_enzymes == DNAstring)
+ target = C
break
return attack_self()
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index e485a62657d..cb4d5ace22f 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -807,7 +807,7 @@ var/global/list/possible_items_special = list()
var/turf/cloc = get_turf(changeling.current)
if(cloc && cloc.onCentcom() && (changeling.current.stat != DEAD)) //Living changeling on centcomm....
for(var/name in check_names) //Is he (disguised as) one of the staff?
- if(H.dna && H.dna.real_name == name)
+ if(H.dna.real_name == name)
check_names -= name //This staff member is accounted for, remove them, so the team don't succeed by escape as 7 of the same engineer
success++ //A living changeling staff member made it to centcomm
continue changelings
diff --git a/code/game/gamemodes/setupgame.dm b/code/game/gamemodes/setupgame.dm
index 2e5721b5fe7..e2a6af4e114 100644
--- a/code/game/gamemodes/setupgame.dm
+++ b/code/game/gamemodes/setupgame.dm
@@ -1,4 +1,4 @@
-/datum/subsystem/ticker/proc/setupGenetics()
+/datum/subsystem/objects/proc/setupGenetics()
var/list/avnums = new /list(DNA_STRUC_ENZYMES_BLOCKS)
for(var/i=1, i<=DNA_STRUC_ENZYMES_BLOCKS, i++)
avnums[i] = i
diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm
index 01cae7b3b94..fbcc07e8296 100644
--- a/code/game/gamemodes/shadowling/shadowling_abilities.dm
+++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm
@@ -297,7 +297,7 @@
user.equip_to_slot_or_del(new /obj/item/clothing/gloves/shadowling(usr), slot_gloves)
user.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/shadowling(usr), slot_wear_mask)
user.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/shadowling(usr), slot_glasses)
- hardset_dna(user, null, null, null, null, /datum/species/shadow/ling)
+ user.set_species(/datum/species/shadow/ling)
/obj/effect/proc_holder/spell/targeted/collective_mind //Lets a shadowling bring together their thralls' strength, granting new abilities and a headcount
@@ -569,7 +569,7 @@ datum/reagent/shadowling_blindness_smoke //Reagent used for above spell
thrallToRevive.visible_message("[thrallToRevive] slowly rises, no longer recognizable as human.", \
"You feel new power flow into you. You have been gifted by your masters. You now closely resemble them. You are empowered in \
darkness but wither slowly in light. In addition, Lesser Glare and Guise have been upgraded into their true forms.")
- hardset_dna(thrallToRevive, null, null, null, null, /datum/species/shadow/ling/lesser)
+ thrallToRevive.set_species(/datum/species/shadow/ling/lesser)
thrallToRevive.mind.remove_spell(/obj/effect/proc_holder/spell/targeted/lesser_glare)
thrallToRevive.mind.remove_spell(/obj/effect/proc_holder/spell/targeted/lesser_shadow_walk)
thrallToRevive.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/glare(null))
diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm
index 8cbba92304a..3ab3d435b03 100644
--- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm
+++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm
@@ -84,7 +84,7 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/shadowling(H), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/shadowling(H), slot_wear_mask)
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/shadowling(H), slot_glasses)
- hardset_dna(H, null, null, null, null, /datum/species/shadow/ling) //can't be a shadowling without being a shadowling
+ H.set_species(/datum/species/shadow/ling) //can't be a shadowling without being a shadowling
sleep(10)
H << "Your powers are awoken. You may now live to your fullest extent. Remember your goal. Cooperate with your thralls and allies."
diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm
index 06a94232ece..582eb0ebceb 100644
--- a/code/game/gamemodes/wizard/artefact.dm
+++ b/code/game/gamemodes/wizard/artefact.dm
@@ -22,9 +22,9 @@
/obj/item/weapon/veilrender/attack_self(mob/user)
if(charges > 0)
- new /obj/effect/rend(get_turf(usr), spawn_type, spawn_amt, rend_desc, spawn_fast)
+ new /obj/effect/rend(get_turf(user), spawn_type, spawn_amt, rend_desc, spawn_fast)
charges--
- user.visible_message("[src] hums with power as [usr] deals a blow to [activate_descriptor] itself!")
+ user.visible_message("[src] hums with power as [user] deals a blow to [activate_descriptor] itself!")
else
user << "The unearthly energies that powered the blade are now dormant."
@@ -59,7 +59,7 @@
/obj/effect/rend/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/nullrod))
- user.visible_message("[usr] seals \the [src] with \the [I].")
+ user.visible_message("[user] seals \the [src] with \the [I].")
qdel(src)
return
..()
@@ -97,7 +97,7 @@
/obj/item/weapon/scrying/attack_self(mob/user)
user << "You can see...everything!"
- visible_message("[usr] stares into [src], their eyes glazing over.")
+ visible_message("[user] stares into [src], their eyes glazing over.")
user.ghostize(1)
return
@@ -118,7 +118,7 @@
unlimited = 1
/obj/item/device/necromantic_stone/attack(mob/living/carbon/human/M, mob/living/carbon/human/user)
- if(!istype(M, /mob/living/carbon/human))
+ if(!istype(M))
return ..()
if(!istype(user) || !user.canUseTopic(M,1))
@@ -137,7 +137,7 @@
user << "This artifact can only affect three undead at a time!"
return
- hardset_dna(M, null, null, null, null, /datum/species/skeleton)
+ M.set_species(/datum/species/skeleton, icon_update=0)
M.revive()
spooky_scaries |= M
M << "You have been revived by [user.real_name]!"
@@ -261,13 +261,24 @@ var/global/list/multiverse = list()
/obj/item/weapon/multisword/proc/spawn_copy(var/client/C, var/turf/T)
var/mob/living/carbon/human/M = new/mob/living/carbon/human(T)
- C.prefs.copy_to(M)
+ C.prefs.copy_to(M, icon_updates=0)
M.key = C.key
M.mind.name = usr.real_name
M << "You are an alternate version of [usr.real_name] from another universe! Help them accomplish their goals at all costs."
M.real_name = usr.real_name
M.name = usr.real_name
M.faction = list("[usr.real_name]")
+ if(prob(50))
+ var/list/all_species = list()
+ for(var/speciestype in typesof(/datum/species) - /datum/species)
+ var/datum/species/S = new speciestype()
+ if(!S.dangerous_existence)
+ all_species += speciestype
+ M.set_species(pick(all_species), icon_update=0)
+ M.update_body()
+ M.update_hair()
+ M.update_mutcolor()
+ M.dna.update_dna_identity()
equip_copy(M)
if(evil)
@@ -440,14 +451,6 @@ var/global/list/multiverse = list()
else
return
- ready_dna(M)
- if(M.dna && prob(50))
- var/list/all_species = list()
- for(var/speciestype in typesof(/datum/species) - /datum/species)
- var/datum/species/S = new speciestype()
- if(!S.dangerous_existence)
- all_species += speciestype
- hardset_dna(M, null, null, null, null, pick(all_species))
M.update_icons()
M.update_augments()
diff --git a/code/game/gamemodes/wizard/raginmages.dm b/code/game/gamemodes/wizard/raginmages.dm
index d59f47796b5..d53f5fa2dba 100644
--- a/code/game/gamemodes/wizard/raginmages.dm
+++ b/code/game/gamemodes/wizard/raginmages.dm
@@ -130,7 +130,7 @@
var/mob/living/carbon/human/new_character = new(pick(latejoin))//The mob being spawned.
G_found.client.prefs.copy_to(new_character)
- ready_dna(new_character)
+ new_character.dna.update_dna_identity()
new_character.key = G_found.key
return new_character
diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm
index a7b0ab3ca3b..ca5fb09823c 100644
--- a/code/game/jobs/job/job.dm
+++ b/code/game/jobs/job/job.dm
@@ -50,14 +50,12 @@
return 0
//Equip the rest of the gear
- if(H.dna)
- H.dna.species.before_equip_job(src, H)
+ H.dna.species.before_equip_job(src, H)
if(outfit)
H.equipOutfit(outfit)
- if(H.dna)
- H.dna.species.after_equip_job(src, H)
+ H.dna.species.after_equip_job(src, H)
/datum/job/proc/apply_fingerprints(mob/living/carbon/human/H)
if(!istype(H))
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index e11ebd25a9e..221d898227c 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -185,7 +185,7 @@
H.ckey = ckey
H << "Consciousness slowly creeps over you as your body regenerates. So this is what cloning feels like?"
- hardset_dna(H, ui, se, null, null, mrace, features)
+ H.hardset_dna(ui, se, H.real_name, null, mrace, features)
H.faction |= factions
H.set_cloned_appearance()
@@ -301,13 +301,13 @@
return
/obj/machinery/clonepod/proc/go_out()
- if (src.locked)
+ if (locked)
return
- if (src.mess) //Clean that mess and dump those gibs!
- src.mess = 0
- gibs(src.loc)
- src.icon_state = "pod_0"
+ if (mess) //Clean that mess and dump those gibs!
+ mess = 0
+ gibs(loc)
+ icon_state = "pod_0"
/*
for(var/obj/O in src)
@@ -315,22 +315,22 @@
*/
return
- if (!(src.occupant))
+ if (!occupant)
return
/*
for(var/obj/O in src)
O.loc = src.loc
*/
- if (src.occupant.client)
- src.occupant.client.eye = src.occupant.client.mob
- src.occupant.client.perspective = MOB_PERSPECTIVE
+ if (occupant.client)
+ occupant.client.eye = occupant.client.mob
+ occupant.client.perspective = MOB_PERSPECTIVE
if(occupant.loc == src)
- src.occupant.loc = src.loc
- src.icon_state = "pod_0"
- src.eject_wait = 0 //If it's still set somehow.
- domutcheck(src.occupant) //Waiting until they're out before possible monkeyizing.
- src.occupant = null
+ occupant.loc = loc
+ icon_state = "pod_0"
+ eject_wait = 0 //If it's still set somehow.
+ occupant.domutcheck() //Waiting until they're out before possible monkeyizing.
+ occupant = null
return
/obj/machinery/clonepod/proc/malfunction()
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index 65f0690047d..8cfd51a294f 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -350,7 +350,7 @@
return
/obj/machinery/computer/cloning/proc/scan_mob(mob/living/carbon/human/subject)
- if (!check_dna_integrity(subject) || !istype(subject))
+ if (!istype(subject))
scantemp = "Unable to locate valid genetic data."
return
if (!subject.getorgan(/obj/item/organ/internal/brain))
diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm
new file mode 100644
index 00000000000..5de7d5b4adb
--- /dev/null
+++ b/code/game/machinery/computer/dna_console.dm
@@ -0,0 +1,482 @@
+#define INJECTOR_TIMEOUT 300
+#define REJUVENATORS_INJECT 15
+#define REJUVENATORS_MAX 90
+#define NUMBER_OF_BUFFERS 3
+
+#define RADIATION_STRENGTH_MAX 15
+#define RADIATION_STRENGTH_MULTIPLIER 1 //larger has a more range
+
+#define RADIATION_DURATION_MAX 30
+#define RADIATION_ACCURACY_MULTIPLIER 3 //larger is less accurate
+
+#define RADIATION_IRRADIATION_MULTIPLIER 0.2 //multiplier for how much radiation a test subject recieves
+
+/obj/machinery/computer/scan_consolenew
+ name = "\improper DNA scanner access console"
+ desc = "Scan DNA."
+ icon_screen = "dna"
+ icon_keyboard = "med_key"
+ density = 1
+ circuit = /obj/item/weapon/circuitboard/scan_consolenew
+ var/radduration = 2
+ var/radstrength = 1
+
+ var/list/buffer[NUMBER_OF_BUFFERS]
+
+ var/injectorready = 0 //Quick fix for issue 286 (screwdriver the screen twice to restore injector) -Pete
+ var/current_screen = "mainmenu"
+ var/obj/machinery/dna_scannernew/connected = null
+ var/obj/item/weapon/disk/data/diskette = null
+ anchored = 1
+ use_power = 1
+ idle_power_usage = 10
+ active_power_usage = 400
+
+/obj/machinery/computer/scan_consolenew/attackby(obj/item/I, mob/user, params)
+ if (istype(I, /obj/item/weapon/disk/data)) //INSERT SOME DISKETTES
+ if (!src.diskette)
+ if(!user.drop_item())
+ return
+ I.loc = src
+ src.diskette = I
+ user << "You insert [I]."
+ src.updateUsrDialog()
+ return
+ else
+ ..()
+ return
+
+/obj/machinery/computer/scan_consolenew/New()
+ ..()
+
+ spawn(5)
+ for(dir in list(NORTH,EAST,SOUTH,WEST))
+ connected = locate(/obj/machinery/dna_scannernew, get_step(src, dir))
+ if(!isnull(connected))
+ break
+ spawn(250)
+ injectorready = 1
+ return
+ return
+
+/obj/machinery/computer/scan_consolenew/attack_hand(mob/user)
+ if(..())
+ return
+ ShowInterface(user)
+
+/obj/machinery/computer/scan_consolenew/proc/ShowInterface(mob/user, last_change)
+ if(!user) return
+ var/datum/browser/popup = new(user, "scannernew", "DNA Modifier Console", 800, 630) // Set up the popup browser window
+ if(!( in_range(src, user) || istype(user, /mob/living/silicon) ))
+ popup.close()
+ return
+ popup.add_stylesheet("scannernew", 'html/browser/scannernew.css')
+
+ var/mob/living/carbon/viable_occupant
+ var/occupant_status = "
"
for(var/mob/living/carbon/human/H in mob_list)
if(H.ckey)
- if(H.dna && H.dna.uni_identity)
- dat += "
[H]
[md5(H.dna.uni_identity)]
"
- else if(H.dna && !H.dna.uni_identity)
- dat += "
[H]
H.dna.uni_identity = null
"
- else if(!H.dna)
- dat += "
[H]
H.dna = null
"
+ dat += "
[H]
[md5(H.dna.uni_identity)]
"
dat += "
"
usr << browse(dat, "window=fingerprints;size=440x410")
@@ -259,8 +254,7 @@
message_admins("\blue [key_name_admin(usr)] turned all humans into [result]")
var/newtype = species_list[result]
for(var/mob/living/carbon/human/H in mob_list)
- hardset_dna(H, null, null, null, null, newtype)
- H.regenerate_icons()
+ H.set_species(newtype)
if("corgi")
if(!check_rights(R_FUN))
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index d1275930c8c..d832c960d13 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1527,7 +1527,6 @@
var/client/C = usr.client
if(!isobserver(usr)) C.admin_ghost()
var/mob/dead/observer/A = C.mob
- sleep(2)
A.ManualFollow(M)
log_admin("[key_name(usr)] followed [key_name(M)]")
message_admins("[key_name_admin(usr)] followed [key_name_admin(M)]")
diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm
index 19cc6dd5667..00a51054c80 100644
--- a/code/modules/admin/verbs/deadsay.dm
+++ b/code/modules/admin/verbs/deadsay.dm
@@ -26,7 +26,7 @@
for (var/mob/M in player_list)
if (istype(M, /mob/new_player))
continue
- if (M.stat == DEAD || (M.client && M.client.holder && (M.client.prefs.chat_toggles & CHAT_DEAD))) //admins can toggle deadchat on and off. This is a proc in admin.dm and is only give to Administrators and above
+ if (M.stat == DEAD || istype(M, /mob/living/simple_animal/revenant) || (M.client && M.client.holder && (M.client.prefs.chat_toggles & CHAT_DEAD))) //admins can toggle deadchat on and off. This is a proc in admin.dm and is only give to Administrators and above
M.show_message(rendered, 2)
feedback_add_details("admin_verb","D") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
\ No newline at end of file
diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm
index 2ba4e19149b..198dbff5c2e 100644
--- a/code/modules/admin/verbs/one_click_antag.dm
+++ b/code/modules/admin/verbs/one_click_antag.dm
@@ -326,13 +326,13 @@
//Spawn and equip the commando
var/mob/living/carbon/human/Commando = new(spawnloc)
chosen_candidate.client.prefs.copy_to(Commando)
- ready_dna(Commando)
if(numagents == 1) //If Squad Leader
Commando.real_name = "Officer [pick(commando_names)]"
Commando.equipOutfit(/datum/outfit/death_commando/officer)
else
Commando.real_name = "Trooper [pick(commando_names)]"
Commando.equipOutfit(/datum/outfit/death_commando)
+ Commando.dna.update_dna_identity()
Commando.key = chosen_candidate.key
Commando.mind.assigned_role = "Death Commando"
for(var/obj/machinery/door/poddoor/ert/door in airlocks)
@@ -420,8 +420,8 @@
//Create the official
var/mob/living/carbon/human/newmob = new (pick(emergencyresponseteamspawn))
chosen_candidate.client.prefs.copy_to(newmob)
- ready_dna(newmob)
newmob.real_name = newmob.dna.species.random_name(newmob.gender,1)
+ newmob.dna.update_dna_identity()
newmob.key = chosen_candidate.key
newmob.mind.assigned_role = "Centcom Official"
newmob.equipOutfit(/datum/outfit/centcom_official)
@@ -490,7 +490,6 @@
var/mob/living/carbon/human/ERTOperative = new(spawnloc)
var/list/lastname = last_names
chosen_candidate.client.prefs.copy_to(ERTOperative)
- ready_dna(ERTOperative)
var/ertname = pick(lastname)
switch(numagents)
if(1)
@@ -514,6 +513,7 @@
if(7)
ERTOperative.real_name = "Engineer [ertname]"
ERTOperative.equipOutfit(redalert ? /datum/outfit/ert/engineer/alert : /datum/outfit/ert/engineer)
+ ERTOperative.dna.update_dna_identity()
ERTOperative.key = chosen_candidate.key
ERTOperative.mind.assigned_role = "ERT"
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 7cb4c9f4994..6e314d19ee0 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -300,15 +300,13 @@ Traitors and the like can also be revived with the previous role mostly intact.
new_character.real_name = record_found.fields["name"]
new_character.gender = record_found.fields["sex"]
new_character.age = record_found.fields["age"]
- new_character.dna.blood_type = record_found.fields["blood_type"]
+ new_character.hardset_dna(record_found.fields["identity"], record_found.fields["enzymes"], record_found.fields["name"], record_found.fields["blood_type"], record_found.fields["species"], record_found.fields["features"])
else
- new_character.gender = pick(MALE,FEMALE)
var/datum/preferences/A = new()
- A.real_name = G_found.real_name
A.copy_to(new_character)
+ A.real_name = G_found.real_name
+ new_character.dna.update_dna_identity()
- if(!new_character.real_name)
- new_character.real_name = new_character.dna.species.random_name(new_character.gender,1)
new_character.name = new_character.real_name
if(G_found.mind && !G_found.mind.active)
@@ -316,13 +314,8 @@ Traitors and the like can also be revived with the previous role mostly intact.
new_character.mind.special_verbs = list()
else
new_character.mind_initialize()
- if(!new_character.mind.assigned_role) new_character.mind.assigned_role = "Assistant"//If they somehow got a null assigned role.
-
- //DNA
- if(record_found)//Pull up their name from database records if they did have a mind.
- hardset_dna(new_character, record_found.fields["identity"], record_found.fields["enzymes"], record_found.fields["name"], record_found.fields["blood_type"], record_found.fields["species"], record_found.fields["features"])
- else//If they have no records, we just do a random DNA for them, based on their random appearance/savefile.
- ready_dna(new_character)
+ 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
@@ -822,7 +815,7 @@ var/list/datum/outfit/custom_outfits = list() //Admin created outfits
id_select += ""
id_select += ""
- var/dat = {"
+ var/dat = {"
Create Outfit