This commit is contained in:
Razharas
2015-09-02 19:04:16 +03:00
69 changed files with 595 additions and 502 deletions
+191
View File
@@ -0,0 +1,191 @@
//Ok so it's technically a double linked list, bite me.
/datum/linked_list
var/datum/linked_node/head
var/datum/linked_node/tail
var/node_amt = 0
/datum/linked_node
var/value = null
var/datum/linked_list/linked_list = null
var/datum/linked_node/next_node = null
var/datum/linked_node/previous_node = null
/datum/linked_list/proc/IsEmpty()
. = (node_amt <= 0)
//Add a linked_node (or value, creating a linked_node) at position
//the added node BECOMES the position-th element,
//eg: add("Test",5), the 5th node is now "Test", the previous 5th moves up to become the 6th
/datum/linked_list/proc/Add(node, position)
var/datum/linked_node/adding
if(istype(node, /datum/linked_node))
adding = node
else
adding = new()
adding.value = node
if(!adding.linked_list || (adding.linked_list && (adding.linked_list != src)))
node_amt++
adding.linked_list = src
if(position && position < node_amt)
//Replacing head
if(position == 1)
if(head)
head.previous_node = adding
adding.next_node = head
head = adding
//Replacing any middle node
else
var/location = 0
var/datum/linked_node/at
while((location != position) && (location <= node_amt))
if(at)
if(at.next_node)
at = at.next_node
else
break
else
at = head
location++
//Push at up and assume it's place as the position-th element
if(at && at.previous_node)
at.previous_node.next_node = adding
adding.previous_node = at.previous_node
at.previous_node = adding
adding.next_node = at
return
//Replacing tail
if(tail)
tail.next_node = adding
adding.previous_node = tail
if(!tail.previous_node)
head = tail
tail = adding
//Remove a linked_node or the linked_node of a value
//If you specify a value the FIRST ONE is removed
/datum/linked_list/proc/Remove(node)
var/datum/linked_node/removing
if(istype(node,/datum/linked_node))
removing = node
else
//optimise removing head and tail, no point looping for them, especially the tail
if(removing == head)
removing = head
else if(removing == tail)
removing = tail
else
var/location = 1
var/current_value = null
var/datum/linked_node/at = null
while((current_value != node) && (location <= node_amt))
if(at)
if(at.next_node)
at = at.next_node
else
at = head
location++
if(at)
current_value = at.value
if(current_value == node)
removing = at
break
//Adjust pointers of where removing -was- in the chain.
if(removing)
if(removing.previous_node)
if(removing == tail)
tail = removing.previous_node
if(removing.next_node)
if(removing == head)
head = removing.next_node
removing.next_node.previous_node = removing.previous_node
removing.previous_node.next_node = removing.next_node
else
removing.previous_node.next_node = null
else
if(removing.next_node)
if(removing == head)
head = removing.next_node
removing.next_node.previous_node = null
//if this is still true at this point, there's no more nodes to replace them with
if(removing == head)
head = null
if(removing == tail)
tail = null
removing.next_node = null
removing.previous_node = null
if(removing.linked_list == src)
node_amt--
removing.linked_list = null
return removing
return 0
//Removes and deletes a node or value
/datum/linked_list/proc/RemoveDelete(node)
var/datum/linked_node/dead = Remove(node)
if(dead)
qdel(dead)
return 1
return 0
//Empty the linked_list, deleting all nodes
/datum/linked_list/proc/Empty()
var/datum/linked_node/n = head
while(n)
var/next = n.next_node
Remove(n)
qdel(n)
n = next
node_amt = 0
//Some debugging tools
/datum/linked_list/proc/CheckNodeLinks()
var/datum/linked_node/n = head
while(n)
. = "|[n.value]|"
if(n.previous_node)
. = "[n.previous_node.value]<-" + .
if(n.next_node)
. += "->[n.next_node.value]"
n = n.next_node
. += "<BR>"
/datum/linked_list/proc/DrawNodeLinks()
. = "|<-"
var/datum/linked_node/n = head
while(n)
if(n.previous_node)
. += "<-"
. += "[n.value]"
if(n.next_node)
. += "->"
n = n.next_node
. += "->|"
/datum/linked_list/proc/ToList()
. = list()
var/datum/linked_node/n = head
while(n)
. += n
n = n.next_node
+65
View File
@@ -0,0 +1,65 @@
//////////////////////
//PriorityQueue object
//////////////////////
//an ordered list, using the cmp proc to weight the list elements
/PriorityQueue
var/list/L //the actual queue
var/cmp //the weight function used to order the queue
/PriorityQueue/New(compare)
L = new()
cmp = compare
/PriorityQueue/proc/IsEmpty()
return !L.len
//add an element in the list,
//immediatly ordering it to its position using Insertion sort
/PriorityQueue/proc/Enqueue(atom/A)
var/i
L.Add(A)
i = L.len -1
while(i > 0 && call(cmp)(L[i],A) >= 0) //place the element at it's right position using the compare proc
L.Swap(i,i+1) //last inserted element being first in case of ties (optimization)
i--
//removes and returns the first element in the queue
/PriorityQueue/proc/Dequeue()
if(!L.len)
return 0
. = L[1]
Remove(.)
return .
//removes an element
/PriorityQueue/proc/Remove(atom/A)
return L.Remove(A)
//returns a copy of the elements list
/PriorityQueue/proc/List()
var/list/ret = L.Copy()
return ret
//return the position of an element or 0 if not found
/PriorityQueue/proc/Seek(atom/A)
return L.Find(A)
//return the element at the i_th position
/PriorityQueue/proc/Get(i)
if(i > L.len || i < 1)
return 0
return L[i]
//replace the passed element at it's right position using the cmp proc
/PriorityQueue/proc/ReSort(atom/A)
var/i = Seek(A)
if(i == 0)
return
while(i < L.len && call(cmp)(L[i],L[i+1]) > 0)
L.Swap(i,i+1)
i++
while(i > 1 && call(cmp)(L[i],L[i-1]) <= 0) //last inserted element being first in case of ties (optimization)
L.Swap(i,i-1)
i--
+64
View File
@@ -0,0 +1,64 @@
//Both count as failures, and they don't equate to each other
//this lets us do if(Pop()) without having to specifically check for underflow
//same for if(Push()) and overflow
#define STACK_OVERFLOW -1
#define STACK_UNDERFLOW -2
/datum/stack
var/list/stack = list()
var/max_elements = 0
/datum/stack/New(list/elements,max)
..()
if(elements)
stack = elements.Copy()
if(max)
max_elements = max
/datum/stack/proc/Pop()
if(is_empty())
return STACK_UNDERFLOW
. = stack[stack.len]
stack.Cut(stack.len,0)
/datum/stack/proc/Push(element)
if(max_elements && (stack.len+1 > max_elements))
return STACK_OVERFLOW
stack += element
/datum/stack/proc/Top()
if(is_empty())
return STACK_UNDERFLOW
. = stack[stack.len]
/datum/stack/proc/is_empty()
. = (stack.len > 0)
//Rotate entire stack left with the leftmost looping around to the right
/datum/stack/proc/RotateLeft()
if(is_empty())
return 0
. = stack[1]
stack.Cut(1,2)
Push(.)
//Rotate entire stack to the right with the rightmost looping around to the left
/datum/stack/proc/RotateRight()
if(is_empty())
return 0
. = stack[stack.len]
stack.Cut(stack.len,0)
stack.Insert(1,.)
/datum/stack/proc/Copy()
var/datum/stack/S=new()
S.stack = stack.Copy()
S.max_elements = max_elements
return S
/datum/stack/proc/Clear()
stack.Cut()
+1 -1
View File
@@ -40,7 +40,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
var/selection_type = "view" //can be "range" or "view"
var/spell_level = 0 //if a spell can be taken multiple times, this raises
var/level_max = 4 //The max possible level_max is 4
var/cooldown_min = 0 //This defines what spell quickened four timeshas as a cooldown. Make sure to set this for every spell
var/cooldown_min = 0 //This defines what spell quickened four times has as a cooldown. Make sure to set this for every spell
var/overlay = 0
var/overlay_icon = 'icons/obj/wizard.dmi'
+32
View File
@@ -0,0 +1,32 @@
/obj/effect/proc_holder/spell/bloodcrawl
name = "Blood crawl"
desc = "Use blood to travel."
charge_max = 10
clothes_req = 0
selection_type = "range"
range = 1
cooldown_min = 0
overlay = null
action_icon_state = "bloodcrawl"
var/phased = 0
/obj/effect/proc_holder/spell/bloodcrawl/choose_targets(mob/user = usr)
for(var/obj/effect/decal/cleanable/target in range(range, get_turf(user)))
if(istype(target, /obj/effect/decal/cleanable/blood) || istype(target, /obj/effect/decal/cleanable/trail_holder))
perform(target)
return
revert_cast()
user << "<span class='warning'>You need blood to blood crawl.</span>"
/obj/effect/proc_holder/spell/bloodcrawl/perform(obj/effect/decal/cleanable/target, recharge = 1, mob/living/user = usr)
if(istype(user))
if(phased)
if(user.phasein(target))
phased = 0
else
user.phaseout(target)
phased = 1
start_recharge()
return
revert_cast()
user << "<span class='warning'>You cannot blood crawl.</span>"
+2 -2
View File
@@ -477,7 +477,7 @@ var/list/uplink_items = list()
/datum/uplink_item/stealthy_tools/camera_bug
name = "Camera Bug"
desc = "Enables you to bug cameras to view them remotely. Adding particular items to it alters its functions."
desc = "Enables you to view all cameras on the network and track a target. Bugging cameras allows you to disable them remotely"
item = /obj/item/device/camera_bug
cost = 1
surplus = 90
@@ -526,7 +526,7 @@ var/list/uplink_items = list()
item = /obj/item/weapon/storage/belt/military
cost = 3
excludefrom = list(/datum/game_mode/nuclear)
/datum/uplink_item/device_tools/medkit
name = "Syndicate Combat Medic Kit"
desc = "The syndicate medkit is a suspicious black and red. Included is a combat stimulant injector for rapid healing, a medical hud for quick identification of injured comrades, \
+2 -2
View File
@@ -277,9 +277,9 @@
var/datum/objective/objective = team_objectives[team_number]
var/team_name = team_names[team_number]
if(console.experiment.points >= objective.target_amount)
world << "<span class='greentext'><b>[team_name] team fullfilled its mission!</b></span>"
world << "<span class='greenannounce'>[team_name] team fullfilled its mission!</span>"
else
world << "<span class='greentext'><b>[team_name] team failed its mission.</b></span>"
world << "<span class='boldannounce'>[team_name] team failed its mission.</span>"
..()
return 1
+2 -3
View File
@@ -45,8 +45,7 @@
var/datum/game_mode/blob/blob_mode = src
if(blob_mode.infected_crew.len)
var/text = "<FONT size = 2><B>The blob[(blob_mode.infected_crew.len > 1 ? "s were" : " was")]:</B></FONT>"
for(var/datum/mind/blob in blob_mode.infected_crew)
text += "<br><b>[blob.key]</b> was <b>[blob.name]</b>"
text += printplayer(blob)
world << text
return 1
return 1
+2 -2
View File
@@ -26,7 +26,7 @@
/mob/living/simple_animal/hostile/blob/blobspore
name = "blob"
desc = "Some blob thing."
desc = "A floating, fragile spore."
icon_state = "blobpod"
icon_living = "blobpod"
health = 40
@@ -146,7 +146,7 @@
/mob/living/simple_animal/hostile/blob/blobbernaut
name = "blobbernaut"
desc = "Some HUGE blob thing."
desc = "A hulking, mobile chunk of blobmass."
icon_state = "blobbernaut"
icon_living = "blobbernaut"
icon_dead = "blobbernaut_dead"
+5
View File
@@ -2,8 +2,10 @@
name = "blob core"
icon = 'icons/mob/blob.dmi'
icon_state = "blank_blob"
desc = "A huge, pulsating yellow mass."
health = 200
fire_resist = 2
explosion_block = 6
var/overmind_get_delay = 0 // we don't want to constantly try to find an overmind, do it every 30 seconds
var/resource_delay = 0
var/point_rate = 2
@@ -44,6 +46,9 @@
/obj/effect/blob/core/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
return
/obj/effect/blob/core/ex_act(severity, target)
return
/obj/effect/blob/core/update_icon()
if(health <= 0)
qdel(src)
@@ -2,6 +2,7 @@
name = "factory blob"
icon = 'icons/mob/blob.dmi'
icon_state = "blob_factory"
desc = "A thick spire of tendrils."
health = 100
fire_resist = 2
var/list/spores = list()
+1
View File
@@ -2,6 +2,7 @@
name = "blob node"
icon = 'icons/mob/blob.dmi'
icon_state = "blank_blob"
desc = "A large, pulsating yellow mass."
health = 100
fire_resist = 2
@@ -2,6 +2,7 @@
name = "resource blob"
icon = 'icons/mob/blob.dmi'
icon_state = "blob_resource"
desc = "A thin spire of slightly swaying tendrils."
health = 30
fire_resist = 2
var/resource_delay = 0
+2 -1
View File
@@ -2,8 +2,9 @@
name = "strong blob"
icon = 'icons/mob/blob.dmi'
icon_state = "blob_idle"
desc = "Some blob creature thingy"
desc = "A solid wall of slightly twitching tendrils."
health = 75
explosion_block = 3
fire_resist = 2
@@ -2,6 +2,7 @@
name = "storage blob"
icon = 'icons/mob/blob.dmi'
icon_state = "blob_resource"
desc = "A huge, smooth mass supported by tendrils."
health = 30
fire_resist = 2
+2 -1
View File
@@ -3,10 +3,11 @@
name = "blob"
icon = 'icons/mob/blob.dmi'
luminosity = 3
desc = "Some blob creature thingy"
desc = "A thick wall of writhing tendrils."
density = 0
opacity = 0
anchored = 1
explosion_block = 1
var/health = 30
var/health_timestamp = 0
var/brute_resist = 4
+9 -9
View File
@@ -313,11 +313,11 @@
if(!check_cult_victory())
feedback_set_details("round_end_result","win - cult win")
feedback_set("round_end_result",acolytes_survived)
world << "<span class='danger'><FONT size = 3>The cult wins! It has succeeded in serving its dark masters!</FONT></span>"
world << "<span class='redtext'>The cult wins! It has succeeded in serving its dark masters!</span>"
else
feedback_set_details("round_end_result","loss - staff stopped the cult")
feedback_set("round_end_result",acolytes_survived)
world << "<span class='danger'><FONT size = 3>The staff managed to stop the cult!</FONT></span>"
world << "<span class='redtext'>The staff managed to stop the cult!</span>"
var/text = ""
@@ -328,28 +328,28 @@
switch(cult_objectives[obj_count])
if("survive")
if(!check_survive())
explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. ([acolytes_survived] escaped) <font color='green'><B>Success!</B></font>"
explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. ([acolytes_survived] escaped) <span class='greenannounce'>Success!</span>"
feedback_add_details("cult_objective","cult_survive|SUCCESS|[acolytes_needed]")
else
explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. ([acolytes_survived] escaped) <span class='danger'>Fail.</span>"
explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. ([acolytes_survived] escaped) <span class='boldannounce'>Fail.</span>"
feedback_add_details("cult_objective","cult_survive|FAIL|[acolytes_needed]")
if("sacrifice")
if(sacrifice_target)
if(sacrifice_target in sacrificed)
explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. <font color='green'><B>Success!</B></font>"
explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. <span class='greenannounce'>Success!</span>"
feedback_add_details("cult_objective","cult_sacrifice|SUCCESS")
else if(sacrifice_target && sacrifice_target.current)
explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. <span class='danger'>Fail.</span>"
explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. <span class='boldannounce'>Fail.</span>"
feedback_add_details("cult_objective","cult_sacrifice|FAIL")
else
explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. <span class='danger'>Fail (Gibbed).</span>"
explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. <span class='boldannounce'>Fail (Gibbed).</span>"
feedback_add_details("cult_objective","cult_sacrifice|FAIL|GIBBED")
if("eldergod")
if(!eldergod)
explanation = "Summon Nar-Sie. <font color='green'><B>Success!</B></font>"
explanation = "Summon Nar-Sie. <span class='greenannounce'>Success!</span>"
feedback_add_details("cult_objective","cult_narsie|SUCCESS")
else
explanation = "Summon Nar-Sie. <span class='danger'>Fail.</span>"
explanation = "Summon Nar-Sie. <span class='boldannounce'>Fail.</span>"
feedback_add_details("cult_objective","cult_narsie|FAIL")
text += "<br><B>Objective #[obj_count]</B>: [explanation]"
+8 -6
View File
@@ -471,17 +471,19 @@
if(M.client && M.client.holder)
M << msg
/datum/game_mode/proc/printplayer(datum/mind/ply)
/datum/game_mode/proc/printplayer(datum/mind/ply, fleecheck)
var/text = "<br><b>[ply.key]</b> was <b>[ply.name]</b> the <b>[ply.assigned_role]</b> and"
if(ply.current)
if(ply.current.stat == DEAD)
text += " <font color='red'><b>died</b></font>"
text += " <span class='boldannounce'>died</span>"
else
text += " <font color='green'><b>survived</b></font>"
text += " <span class='greenannounce'>survived</span>"
if(fleecheck && ply.current.z > ZLEVEL_STATION)
text += " while <span class='boldannounce'>fleeing the station</span>"
if(ply.current.real_name != ply.name)
text += " as <b>[ply.current.real_name]</b>"
else
text += " <font color='red'><b>had their body destroyed</b></font>"
text += " <span class='boldannounce'>had their body destroyed</span>"
return text
/datum/game_mode/proc/printobjectives(datum/mind/ply)
@@ -489,9 +491,9 @@
var/count = 1
for(var/datum/objective/objective in ply.objectives)
if(objective.check_completion())
text += "<br><b>Objective #[count]</b>: [objective.explanation_text] <font color='green'><b>Success!</b></font>"
text += "<br><b>Objective #[count]</b>: [objective.explanation_text] <span class='greenannounce'>Success!</span>"
else
text += "<br><b>Objective #[count]</b>: [objective.explanation_text] <span class='danger'>Fail.</span>"
text += "<br><b>Objective #[count]</b>: [objective.explanation_text] <span class='boldannounce'>Fail.</span>"
count++
return text
+11 -30
View File
@@ -248,39 +248,20 @@ var/list/gang_colors_pool = list("red","orange","yellow","green","blue","purple"
/datum/game_mode/proc/auto_declare_completion_gang(datum/gang/winner)
if(gangs.len)
if(!winner)
world << "<FONT size=3 color=red><B>The station was [station_was_nuked ? "destroyed!" : "evacuated before a gang could claim it! The station wins!"]</B></FONT><br>"
world << "<span class='redtext'>The station was [station_was_nuked ? "destroyed!" : "evacuated before a gang could claim it! The station wins!"]</span><br>"
else
world << "<FONT size=3 color=red><B>The [winner.name] Gang successfully performed a hostile takeover of the station!</B></FONT><br>"
world << "<span class='redtext'>The [winner.name] Gang successfully performed a hostile takeover of the station!</span><br>"
for(var/datum/gang/G in gangs)
world << "<br><b>The [G.name] Gang was [winner==G ? "<font color=green>victorious</font>" : "<font color=red>defeated</font>"] with [round((G.territory.len/start_state.num_territories)*100, 1)]% control of the station!</b>"
world << "<br>The [G.name] Gang Bosses were:"
gang_membership_report(G.bosses)
world << "<br>The [G.name] Gangsters were:"
gang_membership_report(G.gangsters)
world << "<br>"
/datum/game_mode/proc/gang_membership_report(list/membership)
var/text = ""
for(var/datum/mind/gang_mind in membership)
text += "<br><b>[gang_mind.key]</b> was <b>[gang_mind.name]</b> ("
if(gang_mind.current)
if(gang_mind.current.stat == DEAD || isbrain(gang_mind.current))
text += "died"
else if(gang_mind.current.z > ZLEVEL_STATION)
text += "fled the station"
else
text += "survived"
if(gang_mind.current.real_name != gang_mind.name)
text += " as <b>[gang_mind.current.real_name]</b>"
else
text += "body destroyed"
text += ")"
world << text
var/text = "<b>The [G.name] Gang was [winner==G ? "<span class='greenannounce'>victorious</span>" : "<span class='boldannounce'>defeated</span>"] with [round((G.territory.len/start_state.num_territories)*100, 1)]% control of the station!</b>"
text += "<br>The [G.name] Gang Bosses were:"
for(var/datum/mind/boss in G.bosses)
text += printplayer(boss, 1)
text += "<br>The [G.name] Gangsters were:"
for(var/datum/mind/gangster in G.gangsters)
text += printplayer(gangster, 1)
text += "<br>"
world << text
//////////////////////////////////////////////////////////
//Handles influence, territories, and the victory checks//
+1 -13
View File
@@ -286,24 +286,12 @@
if( malf_ai.len || istype(ticker.mode,/datum/game_mode/malfunction) )
var/text = "<br><FONT size=3><B>The malfunctioning AIs were:</B></FONT>"
var/module_text_temp = "<br><b>Purchased modules:</b><br>" //Added at the end
for(var/datum/mind/malf in malf_ai)
text += "<br><b>[malf.key]</b> was <b>[malf.name]</b> ("
text += printplayer(malf, 1)
if(malf.current)
if(malf.current.stat == DEAD)
text += "deactivated"
else
text += "operational"
if(malf.current.real_name != malf.name)
text += " as <b>[malf.current.real_name]</b>"
var/mob/living/silicon/ai/AI = malf.current
for(var/datum/AI_Module/mod in AI.current_modules)
module_text_temp += mod.module_name + "<br>"
else
text += "hardware destroyed"
text += ")"
text += module_text_temp
world << text
return 1
+1 -19
View File
@@ -278,36 +278,18 @@
/datum/game_mode/proc/auto_declare_completion_nuclear()
if( syndicates.len || (ticker && istype(ticker.mode,/datum/game_mode/nuclear)) )
var/text = "<br><FONT size=3><B>The syndicate operatives were:</B></FONT>"
var/purchases = ""
var/TC_uses = 0
for(var/datum/mind/syndicate in syndicates)
text += "<br><b>[syndicate.key]</b> was <b>[syndicate.name]</b> ("
if(syndicate.current)
if(syndicate.current.stat == DEAD)
text += "died"
else
text += "survived"
if(syndicate.current.real_name != syndicate.name)
text += " as <b>[syndicate.current.real_name]</b>"
else
text += "body destroyed"
text += ")"
text += printplayer(syndicate)
for(var/obj/item/device/uplink/H in world_uplinks)
if(H && H.uplink_owner && H.uplink_owner==syndicate.key)
TC_uses += H.used_TC
purchases += H.purchase_log
text += "<br>"
text += "(Syndicates used [TC_uses] TC) [purchases]"
if(TC_uses==0 && station_was_nuked && !are_operatives_dead())
text += "<BIG><IMG CLASS=icon SRC=\ref['icons/BadAss.dmi'] ICONSTATE='badass'></BIG>"
world << text
return 1
+6 -57
View File
@@ -321,16 +321,15 @@
/datum/game_mode/revolution/declare_completion()
if(finished == 1)
feedback_set_details("round_end_result","win - heads killed")
world << "<span class='danger'><FONT size = 3>The heads of staff were killed or exiled! The revolutionaries win!</FONT></span>"
world << "<span class='redtext'>The heads of staff were killed or exiled! The revolutionaries win!</span>"
else if(finished == 2)
feedback_set_details("round_end_result","loss - rev heads killed")
world << "<span class='danger'><FONT size = 3>The heads of staff managed to stop the revolution!</FONT></span>"
world << "<span class='redtext'>The heads of staff managed to stop the revolution!</span>"
..()
return 1
/datum/game_mode/proc/auto_declare_completion_revolution()
var/list/targets = list()
if(head_revolutionaries.len || istype(ticker.mode,/datum/game_mode/revolution))
var/num_revs = 0
var/num_survivors = 0
@@ -340,78 +339,28 @@
if(survivor.mind)
if((survivor.mind in head_revolutionaries) || (survivor.mind in revolutionaries))
num_revs++
if(num_survivors)
world << "[TAB]Command's Approval Rating: <B>[100 - round((num_revs/num_survivors)*100, 0.1)]%</B>" // % of loyal crew
var/text = "<br><font size=3><b>The head revolutionaries were:</b></font>"
for(var/datum/mind/headrev in head_revolutionaries)
text += "<br><b>[headrev.key]</b> was <b>[headrev.name]</b> ("
if(headrev.current)
if(headrev.current.stat == DEAD)
text += "died"
else if(headrev.current.z > ZLEVEL_STATION)
text += "fled the station"
else
text += "survived the revolution"
if(headrev.current.real_name != headrev.name)
text += " as <b>[headrev.current.real_name]</b>"
else
text += "body destroyed"
text += ")"
for(var/datum/objective/mutiny/objective in headrev.objectives)
targets |= objective.target
text += printplayer(headrev, 1)
text += "<br>"
world << text
if(revolutionaries.len || istype(ticker.mode,/datum/game_mode/revolution))
var/text = "<br><font size=3><b>The revolutionaries were:</b></font>"
for(var/datum/mind/rev in revolutionaries)
text += "<br><b>[rev.key]</b> was <b>[rev.name]</b> ("
if(rev.current)
if(rev.current.stat == DEAD || isbrain(rev.current))
text += "died"
else if(rev.current.z > ZLEVEL_STATION)
text += "fled the station"
else
text += "survived the revolution"
if(rev.current.real_name != rev.name)
text += " as <b>[rev.current.real_name]</b>"
else
text += "body destroyed"
text += ")"
text += printplayer(rev, 1)
text += "<br>"
world << text
if( head_revolutionaries.len || revolutionaries.len || istype(ticker.mode,/datum/game_mode/revolution) )
var/text = "<br><font size=3><b>The heads of staff were:</b></font>"
var/list/heads = get_all_heads()
for(var/datum/mind/head in heads)
var/target = (head in targets)
if(target)
text += "<font color='red'>"
text += "<br><b>[head.key]</b> was <b>[head.name]</b> ("
if(head.current)
if(head.current.stat == DEAD || isbrain(head.current))
text += "died"
else if(head.current.z > ZLEVEL_STATION)
text += "fled the station"
else
text += "survived the revolution"
if(head.current.real_name != head.name)
text += " as <b>[head.current.real_name]</b>"
else
text += "body destroyed"
text += ")"
if(target)
text += "</font>"
text += "<span class='boldannounce'>Target</span>"
text += printplayer(head, 1)
text += "<br>"
world << text
+4 -4
View File
@@ -195,13 +195,13 @@ Made by Xhuis
/datum/game_mode/shadowling/declare_completion()
if(check_shadow_victory() && SSshuttle.emergency.mode >= SHUTTLE_ESCAPE) //Doesn't end instantly - this is hacky and I don't know of a better way ~X
world << "<span class='greentext'><b>The shadowlings have ascended and taken over the station!</b></span>"
world << "<span class='greentext'>The shadowlings have ascended and taken over the station!</span>"
else if(shadowling_dead && !check_shadow_victory()) //If the shadowlings have ascended, they can not lose the round
world << "<span class='redtext'><b>The shadowlings have been killed by the crew!</b></span>"
world << "<span class='redtext'>The shadowlings have been killed by the crew!</span>"
else if(!check_shadow_victory() && SSshuttle.emergency.mode >= SHUTTLE_ESCAPE)
world << "<span class='redtext'><b>The crew escaped the station before the shadowlings could ascend!</b></span>"
world << "<span class='redtext'>The crew escaped the station before the shadowlings could ascend!</span>"
else
world << "<span class='redtext'><b>The shadowlings have failed!</b></span>"
world << "<span class='redtext'>The shadowlings have failed!</span>"
..()
return 1
+11 -8
View File
@@ -505,9 +505,19 @@ var/global/list/multiverse = list()
return src.loc == user
/obj/item/voodoo/attack_self(mob/user)
if(!target)
if(!target && possible.len)
target = input(user, "Select your victim!", "Voodoo") as null|anything in possible
return
if(user.zone_sel.selecting == "chest")
if(link)
target = null
link.loc = get_turf(src)
user << "<span class='notice'>You remove the [link] from the doll.</span>"
link = null
update_targets()
return
if(target && cooldown < world.time)
switch(user.zone_sel.selecting)
if("mouth")
@@ -542,13 +552,6 @@ var/global/list/multiverse = list()
target.Dizzy(10)
target << "<span class='warning'>You suddenly feel as if your head was hit with a hammer!</span>"
GiveHint(target,user)
if("chest")
if(link)
target = null
link.loc = get_turf(src)
user << "<span class='notice'>You remove the [link] from the doll.</span>"
link = null
update_targets()
cooldown = world.time + cooldown_time
/obj/item/voodoo/proc/update_targets()
+1 -1
View File
@@ -36,9 +36,9 @@
/datum/game_mode/wizard/post_setup()
for(var/datum/mind/wizard in wizards)
log_game("[wizard.key] (ckey) has been selected as a Wizard")
forge_wizard_objectives(wizard)
//learn_basic_spells(wizard.current)
equip_wizard(wizard.current)
forge_wizard_objectives(wizard)
name_wizard(wizard.current)
greet_wizard(wizard)
if(use_huds)
+2 -2
View File
@@ -8,7 +8,7 @@
throwforce = 5.0
throw_speed = 2
throw_range = 5
w_class = 3.0
w_class = 3.
var/created_name = "Cleanbot"
@@ -151,7 +151,7 @@ text("<A href='?src=\ref[src];power=1'>[on ? "On" : "Off"]</A>"))
PoolOrNew(/obj/effect/effect/foam, loc)
else if (prob(5))
visible_message("[src] makes an excited beeping booping sound!")
audible_message("[src] makes an excited beeping booping sound!")
if(!target) //Search for cleanables it can see.
target = scan(/obj/effect/decal/cleanable/)
+2 -2
View File
@@ -216,7 +216,7 @@
nag()
if(prob(5))
visible_message("[src] makes an excited booping beeping sound!")
audible_message("[src] makes an excited booping beeping sound!")
//Normal scanning procedure. We have tiles loaded, are not emagged.
if(!target && emagged < 2 && amount > 0)
@@ -289,7 +289,7 @@
F.break_tile_to_plating()
else
F.ReplaceWithLattice()
visible_message("<span class='danger'>[src] makes an excited booping sound.</span>")
audible_message("<span class='danger'>[src] makes an excited booping sound.</span>")
spawn(50)
amount ++
anchored = 0
+4 -4
View File
@@ -426,13 +426,13 @@ obj/machinery/bot/mulebot/CanPass(atom/movable/mover, turf/target, height=1.5)
/obj/machinery/bot/mulebot/proc/buzz(type)
switch(type)
if(SIGH)
visible_message("[src] makes a sighing buzz.", "<span class='italics'>You hear an electronic buzzing sound.</span>")
audible_message("[src] makes a sighing buzz.", "<span class='italics'>You hear an electronic buzzing sound.</span>")
playsound(loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
if(ANNOYED)
visible_message("[src] makes an annoyed buzzing sound.", "<span class='italics'>You hear an electronic buzzing sound.</span>")
audible_message("[src] makes an annoyed buzzing sound.", "<span class='italics'>You hear an electronic buzzing sound.</span>")
playsound(loc, 'sound/machines/buzz-two.ogg', 50, 0)
if(DELIGHT)
visible_message("[src] makes a delighted ping!", "<span class='italics'>You hear a ping.</span>")
audible_message("[src] makes a delighted ping!", "<span class='italics'>You hear a ping.</span>")
playsound(loc, 'sound/machines/ping.ogg', 50, 0)
@@ -725,7 +725,7 @@ obj/machinery/bot/mulebot/CanPass(atom/movable/mover, turf/target, height=1.5)
/obj/machinery/bot/mulebot/proc/at_target()
if(!reached_target)
radio_frequency = SUPP_FREQ //Supply channel
visible_message("[src] makes a chiming sound!", "<span class='italics'>You hear a chime.</span>")
audible_message("[src] makes a chiming sound!", "<span class='italics'>You hear a chime.</span>")
playsound(loc, 'sound/machines/chime.ogg', 50, 0)
reached_target = 1
@@ -7,7 +7,7 @@
opacity = 0
anchored = 1
density = 0
layer = OBJ_LAYER + 0.05 //above table, below windoor/airlock/foamed metal.
layer = OBJ_LAYER - 0.5 //above table, below windoor/airlock/foamed metal.
mouse_opacity = 0
var/amount = 3
animate_movement = 0
@@ -91,14 +91,8 @@
/obj/effect/effect/foam/proc/spread_foam()
for(var/direction in cardinal)
var/turf/T = get_step(src,direction)
if(!T)
continue
if(!T.Enter(src))
continue
var/turf/t_loc = get_turf(src)
for(var/turf/T in t_loc.GetAtmosAdjacentTurfs())
var/obj/effect/effect/foam/foundfoam = locate() in T //Don't spread foam where there's already foam!
if(foundfoam)
continue
+6
View File
@@ -98,6 +98,9 @@
if(W.reinf && W.fulltile)
cached_exp_block[T] += W.explosion_block
for(var/obj/effect/blob/B in T)
cached_exp_block[T] += B.explosion_block
for(var/turf/T in affected_turfs)
var/dist = cheap_hypotenuse(T.x, T.y, x0, y0)
@@ -215,6 +218,9 @@
if(W.explosion_block && W.fulltile)
dist += W.explosion_block
for(var/obj/effect/blob/B in T)
dist += B.explosion_block
if(dist < dev)
T.color = "red"
T.maptext = "Dev"
+11 -93
View File
@@ -1,9 +1,3 @@
#define VANILLA_BUG 0
#define UNIVERSAL_BUG 1
#define NETWORK_BUG 2
#define SABOTAGE_BUG 3
#define ADVANCED_BUG 4
#define ADMIN_BUG 5
#define BUGMODE_LIST 0
#define BUGMODE_MONITOR 1
@@ -22,13 +16,9 @@
throw_range = 20
var/obj/machinery/camera/current = null
var/obj/item/expansion = null
var/bugtype = VANILLA_BUG
var/last_net_update = 0
var/last_bugtype = VANILLA_BUG
var/list/bugged_cameras = list()
var/skip_bugcheck = 0
var/track_mode = BUGMODE_LIST
var/last_tracked = 0
@@ -45,9 +35,6 @@
SSobj.processing += src
/obj/item/device/camera_bug/Destroy()
if(expansion)
qdel(expansion)
expansion = null
get_cameras()
for(var/cam_tag in bugged_cameras)
var/obj/machinery/camera/camera = bugged_cameras[cam_tag]
@@ -75,7 +62,7 @@
return null
var/turf/T = get_turf(user.loc)
if(T.z != current.z || (!skip_bugcheck && current.bug != src) || !current.can_use())
if(T.z != current.z || !current.can_use())
user << "<span class='danger'>[src] has lost the signal.</span>"
current = null
user.reset_view(null)
@@ -85,22 +72,13 @@
return 1
/obj/item/device/camera_bug/proc/get_cameras()
if(bugtype != last_bugtype || ( (bugtype in list(UNIVERSAL_BUG,NETWORK_BUG,ADMIN_BUG)) && world.time > (last_net_update + 100)))
if( world.time > (last_net_update + 100))
bugged_cameras = list()
last_bugtype = bugtype
for(var/obj/machinery/camera/camera in cameranet.cameras)
if(camera.stat || !camera.can_use())
continue
switch(bugtype)
if(VANILLA_BUG,SABOTAGE_BUG,ADVANCED_BUG)
if(camera.bug == src)
bugged_cameras[camera.c_tag] = camera
if(UNIVERSAL_BUG)
if(camera.bug)
bugged_cameras[camera.c_tag] = camera
if(NETWORK_BUG,ADMIN_BUG)
if(length(list("SS13","MINE")&camera.network))
bugged_cameras[camera.c_tag] = camera
if(length(list("SS13","MINE")&camera.network))
bugged_cameras[camera.c_tag] = camera
sortList(bugged_cameras)
return bugged_cameras
@@ -116,16 +94,10 @@
for(var/entry in cameras)
var/obj/machinery/camera/C = cameras[entry]
var/functions = ""
switch(bugtype)
if(SABOTAGE_BUG)
functions = " - <a href='?src=\ref[src];emp=\ref[C]'>\[Disable\]</a>"
if(ADVANCED_BUG)
functions = " - <a href='?src=\ref[src];monitor=\ref[C]'>\[Monitor\]</a>"
if(ADMIN_BUG)
if(C.bug == src)
functions = " - <a href='?src=\ref[src];monitor=\ref[C]'>\[Monitor\]</a> <a href='?src=\ref[src];emp=\ref[C]'>\[Disable\]</a>"
else
functions = " - <a href='?src=\ref[src];monitor=\ref[C]'>\[Monitor\]</a>"
if(C.bug == src)
functions = " - <a href='?src=\ref[src];monitor=\ref[C]'>\[Monitor\]</a> <a href='?src=\ref[src];emp=\ref[C]'>\[Disable\]</a>"
else
functions = " - <a href='?src=\ref[src];monitor=\ref[C]'>\[Monitor\]</a>"
html += "<tr><td><a href='?src=\ref[src];view=\ref[C]'>[entry]</a></td><td>[functions]</td></tr>"
if(BUGMODE_MONITOR)
@@ -154,6 +126,9 @@
var/s = (time_diff - 4*m) * 15
if(!s) s = "00"
html += "Last seen near [outstring] ([m]:[s] minute\s ago)<br>"
if( C && (C.bug == src)) //Checks to see if the camera has a bug
html += "<a href='?src=\ref[src];emp=\ref[C]'>\[Disable\]</a>"
else
html += "Not yet seen."
else
@@ -306,63 +281,6 @@
break
src.updateSelfDialog()
/obj/item/device/camera_bug/attackby(obj/item/W,mob/living/user, params)
if(istype(W,/obj/item/weapon/screwdriver) && expansion)
expansion.loc = get_turf(loc)
user << "<span class='notice'>You unscrew [expansion].</span>"
user.put_in_inactive_hand(expansion)
expansion = null
bugtype = VANILLA_BUG
skip_bugcheck = 0
track_mode = BUGMODE_LIST
tracking = null
return
if(expansion || !W)
return ..(W,user)
// I am not sure that this list is or should be final
// really I do not know what to do here.
var/static/list/expandables = list(
/obj/item/weapon/research = ADMIN_BUG, // could have been anything spawn-only
// these are all so hackish I am sorry
/obj/item/device/analyzer = UNIVERSAL_BUG,
/obj/item/weapon/stock_parts/subspace/analyzer = UNIVERSAL_BUG,
/obj/item/device/assembly/igniter = SABOTAGE_BUG,
/obj/item/device/assembly/infra = SABOTAGE_BUG, // ir blaster to disable camera
/obj/item/weapon/stock_parts/subspace/amplifier = SABOTAGE_BUG,
/obj/item/device/radio = NETWORK_BUG,
/obj/item/device/assembly/signaler = NETWORK_BUG,
/obj/item/weapon/stock_parts/subspace/transmitter = NETWORK_BUG,
/obj/item/device/detective_scanner = ADVANCED_BUG,
/obj/item/device/paicard = ADVANCED_BUG,
/obj/item/weapon/stock_parts/scanning_module = ADVANCED_BUG
)
for(var/entry in expandables)
if(istype(W,entry))
if(!user.unEquip(W))
return
bugtype = expandables[entry]
W.loc = src
expansion = W
user << "<span class='notice'>You add [W] to [src].</span>"
get_cameras() // the tracking code will want to know the new camera list
if(bugtype in list(UNIVERSAL_BUG,NETWORK_BUG,ADMIN_BUG))
skip_bugcheck = 1
return
#undef VANILLA_BUG
#undef UNIVERSAL_BUG
#undef NETWORK_BUG
#undef SABOTAGE_BUG
#undef ADVANCED_BUG
#undef ADMIN_BUG
#undef BUGMODE_LIST
#undef BUGMODE_MONITOR
+1 -1
View File
@@ -39,7 +39,7 @@
else
user << "<span class='notice'>You begin reinforcing the floor...</span>"
if(do_after(user, 30, target = src))
if (R.get_amount() >= 2)
if (R.get_amount() >= 2 && !istype(src, /turf/simulated/floor/engine))
ChangeTurf(/turf/simulated/floor/engine)
playsound(src, 'sound/items/Deconstruct.ogg', 80, 1)
R.use(2)
-14
View File
@@ -323,20 +323,6 @@ var/next_external_rsc = 0
'icons/pda_icons/pda_scanner.png',
'icons/pda_icons/pda_signaler.png',
'icons/pda_icons/pda_status.png',
'icons/spideros_icons/sos_1.png',
'icons/spideros_icons/sos_2.png',
'icons/spideros_icons/sos_3.png',
'icons/spideros_icons/sos_4.png',
'icons/spideros_icons/sos_5.png',
'icons/spideros_icons/sos_6.png',
'icons/spideros_icons/sos_7.png',
'icons/spideros_icons/sos_8.png',
'icons/spideros_icons/sos_9.png',
'icons/spideros_icons/sos_10.png',
'icons/spideros_icons/sos_11.png',
'icons/spideros_icons/sos_12.png',
'icons/spideros_icons/sos_13.png',
'icons/spideros_icons/sos_14.png',
'icons/stamp_icons/large_stamp-clown.png',
'icons/stamp_icons/large_stamp-deny.png',
'icons/stamp_icons/large_stamp-ok.png',
+56 -88
View File
@@ -1,94 +1,6 @@
//Travel through pools of blood. Slaughter Demon powers for everyone!
#define BLOODCRAWL 1
#define BLOODCRAWL_EAT 2
/mob/living/proc/phaseout(obj/effect/decal/cleanable/B)
var/mob/living/kidnapped = null
var/turf/mobloc = get_turf(src.loc)
var/turf/bloodloc = get_turf(B.loc)
if(Adjacent(bloodloc))
src.notransform = TRUE
spawn(0)
src.visible_message("[src] sinks into the pool of blood.")
playsound(get_turf(src), 'sound/magic/enter_blood.ogg', 100, 1, -1)
var/obj/effect/dummy/slaughter/holder = PoolOrNew(/obj/effect/dummy/slaughter,mobloc)
src.ExtinguishMob()
if(src.buckled)
src.buckled.unbuckle_mob()
if(src.pulling && src.bloodcrawl == BLOODCRAWL_EAT)
if(istype(src.pulling, /mob/living))
var/mob/living/victim = src.pulling
if(victim.stat == CONSCIOUS)
src.visible_message("[victim] kicks free of the [src] at the last second!")
else
victim.loc = holder
src.visible_message("<span class='warning'><B>The [src] drags [victim] into the pool of blood!</B>")
kidnapped = victim
src.loc = holder
src.holder = holder
if(kidnapped)
src << "<B>You begin to feast on [kidnapped]. You can not move while you are doing this.</B>"
playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
sleep(30)
playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
sleep(30)
playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
sleep(30)
if(kidnapped)
src << "<B>You devour [kidnapped]. Your health is fully restored.</B>"
src.adjustBruteLoss(-1000)
src.adjustFireLoss(-1000)
src.adjustOxyLoss(-1000)
src.adjustToxLoss(-1000)
kidnapped.ghostize()
qdel(kidnapped)
else
src << "<B>You happily devour...nothing? Your meal vanished at some point!</B>"
src.notransform = 0
/mob/living/proc/phasein(obj/effect/decal/cleanable/B)
if(src.notransform)
src << "<B>Finish eating first!</B>"
else
src.loc = B.loc
src.client.eye = src
src.visible_message("<span class='warning'><B>The [src] rises out of the pool of blood!</B>")
playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1)
qdel(src.holder)
src.holder = null
/obj/effect/decal/cleanable/blood/CtrlClick(mob/living/user)
..()
if(user.bloodcrawl)
if(user.holder)
user.phasein(src)
else
user.phaseout(src)
/obj/effect/decal/cleanable/trail_holder/CtrlClick(mob/living/user)
..()
if(user.bloodcrawl)
if(user.holder)
user.phasein(src)
else
user.phaseout(src)
/turf/CtrlClick(var/mob/living/user)
..()
if(user.bloodcrawl)
for(var/obj/effect/decal/cleanable/B in src.contents)
if(istype(B, /obj/effect/decal/cleanable/blood) || istype(B, /obj/effect/decal/cleanable/trail_holder))
if(user.holder)
user.phasein(B)
break
else
user.phaseout(B)
break
/obj/effect/dummy/slaughter //Can't use the wizard one, blocked by jaunt/slow
name = "water"
icon = 'icons/effects/effects.dmi'
@@ -116,3 +28,59 @@ obj/effect/dummy/slaughter/relaymove(mob/user, direction)
/obj/effect/dummy/slaughter/Destroy()
return QDEL_HINT_PUTINPOOL
/mob/living/proc/phaseout(obj/effect/decal/cleanable/B)
var/mob/living/kidnapped = null
var/turf/mobloc = get_turf(src.loc)
src.notransform = TRUE
spawn(0)
src.visible_message("[src] sinks into the pool of blood.")
playsound(get_turf(src), 'sound/magic/enter_blood.ogg', 100, 1, -1)
var/obj/effect/dummy/slaughter/holder = PoolOrNew(/obj/effect/dummy/slaughter,mobloc)
src.ExtinguishMob()
if(src.buckled)
src.buckled.unbuckle_mob()
if(src.pulling && src.bloodcrawl == BLOODCRAWL_EAT)
if(istype(src.pulling, /mob/living))
var/mob/living/victim = src.pulling
if(victim.stat == CONSCIOUS)
src.visible_message("[victim] kicks free of the [src] at the last second!")
else
victim.loc = holder
src.visible_message("<span class='warning'><B>The [src] drags [victim] into the pool of blood!</B>")
kidnapped = victim
src.loc = holder
src.holder = holder
if(kidnapped)
src << "<B>You begin to feast on [kidnapped]. You can not move while you are doing this.</B>"
playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
sleep(30)
playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
sleep(30)
playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
sleep(30)
if(kidnapped)
src << "<B>You devour [kidnapped]. Your health is fully restored.</B>"
src.adjustBruteLoss(-1000)
src.adjustFireLoss(-1000)
src.adjustOxyLoss(-1000)
src.adjustToxLoss(-1000)
kidnapped.ghostize()
qdel(kidnapped)
else
src << "<B>You happily devour...nothing? Your meal vanished at some point!</B>"
src.notransform = 0
/mob/living/proc/phasein(obj/effect/decal/cleanable/B)
if(src.notransform)
src << "<B>Finish eating first!</B>"
return 0
src.loc = B.loc
src.client.eye = src
src.visible_message("<span class='warning'><B>The [src] rises out of the pool of blood!</B>")
playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1)
qdel(src.holder)
src.holder = null
return 1
+2 -2
View File
@@ -8,7 +8,7 @@
#define HEAT_DAMAGE_LEVEL_1 2 //Amount of damage applied when your body temperature just passes the 360.15k safety point
#define HEAT_DAMAGE_LEVEL_2 3 //Amount of damage applied when your body temperature passes the 400K point
#define HEAT_DAMAGE_LEVEL_3 8 //Amount of damage applied when your body temperature passes the 460K point and you are on fire
#define HEAT_DAMAGE_LEVEL_3 10 //Amount of damage applied when your body temperature passes the 460K point and you are on fire
#define COLD_DAMAGE_LEVEL_1 0.5 //Amount of damage applied when your body temperature just passes the 260.15k safety point
#define COLD_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when your body temperature passes the 200K point
@@ -123,7 +123,7 @@
if(thermal_protection >= FIRE_SUIT_MAX_TEMP_PROTECT)
bodytemperature += 11
else
bodytemperature += BODYTEMP_HEATING_MAX
bodytemperature += (BODYTEMP_HEATING_MAX + (fire_stacks * 12))
/mob/living/carbon/human/IgniteMob()
+2 -2
View File
@@ -133,7 +133,7 @@
if(!on_fire)
return 1
if(fire_stacks > 0)
adjust_fire_stacks(-0.2) //the fire is slowly consumed
adjust_fire_stacks(-0.1) //the fire is slowly consumed
else
ExtinguishMob()
return
@@ -145,7 +145,7 @@
location.hotspot_expose(700, 50, 1)
/mob/living/fire_act()
adjust_fire_stacks(0.5)
adjust_fire_stacks(3)
IgniteMob()
@@ -114,6 +114,7 @@
set category = "Guardian"
set desc = "Communicate telepathically with your summoner."
var/input = stripped_input(src, "Please enter a message to tell your summoner.", "Guardian", "")
if(!input) return
for(var/mob/M in mob_list)
if(M == src.summoner || (M in dead_mob_list))
@@ -125,6 +126,7 @@
set category = "Guardian"
set desc = "Communicate telepathically with your guardian."
var/input = stripped_input(src, "Please enter a message to tell your guardian.", "Message", "")
if(!input) return
for(var/mob/M in mob_list)
if(istype (M, /mob/living/simple_animal/hostile/guardian))
@@ -55,7 +55,7 @@
/mob/living/simple_animal/slaughter/phasein()
..()
. = ..()
speed = 0
boost = world.time + 30
@@ -71,7 +71,12 @@
/obj/item/weapon/demonheart/attack_self(mob/living/user)
visible_message("[user] feasts upon the [src].")
for(var/obj/effect/proc_holder/spell/knownspell in user.mind.spell_list)
if(knownspell.type == /obj/effect/proc_holder/spell/bloodcrawl)
user <<"<span class='notice'>You already know how to blood crawl.</span>"
qdel(src)
return
user << "You absorb some of the demon's power!"
user.bloodcrawl = BLOODCRAWL
user.mind.AddSpell(new /obj/effect/proc_holder/spell/bloodcrawl)
qdel(src)
@@ -42,6 +42,9 @@
player_mind.transfer_to(S)
player_mind.assigned_role = "Slaughter Demon"
player_mind.special_role = "Slaughter Demon"
var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new
bloodspell.phased = 1
player_mind.AddSpell(bloodspell)
ticker.mode.traitors |= player_mind
S << S.playstyle_string
S << "<B>You are currently not currently in the same plane of existence as the station. Ctrl+Click a blood pool to manifest.</B>"
+1 -1
View File
@@ -81,7 +81,7 @@
A basic description as to what went wrong.
*/
message
stack/stack
datum/stack/stack
proc
/*
@@ -21,7 +21,7 @@
node
BlockDefinition/program
statement/FunctionDefinition/curFunction
stack
datum/stack
scopes = new()
functions = new()
+3 -3
View File
@@ -56,7 +56,7 @@
var
token/accessor/A=T
node/expression/value/variable/E//=new(A.member)
stack/S=new()
datum/stack/S = new()
while(istype(A.object, /token/accessor))
S.Push(A)
A=A.object
@@ -130,7 +130,7 @@
Takes the operator on top of the opr stack and assigns its operand(s). Then this proc pushes the value of that operation to the top
of the val stack.
*/
Reduce(stack/opr, stack/val)
Reduce(datum/stack/opr, datum/stack/val)
var/node/expression/operator/O=opr.Pop()
if(!O) return
if(!istype(O))
@@ -181,7 +181,7 @@
- <ParseParamExpression()>
*/
ParseExpression(list/end=list(/token/end), list/ErrChars=list("{", "}"), check_functions = 0)
var/stack
var/datum/stack
opr=new
val=new
src.expecting=VALUE
+1 -1
View File
@@ -37,7 +37,7 @@
The token at <index> in <tokens>.
*/
curToken
stack
datum/stack
blocks=new
node/BlockDefinition
GlobalBlock/global_block=new
-23
View File
@@ -1,23 +0,0 @@
/stack
var/list
contents=new
proc
Push(value)
contents+=value
Pop()
if(!contents.len) return null
. = contents[contents.len]
contents.len--
Top() //returns the item on the top of the stack without removing it
if(!contents.len) return null
return contents[contents.len]
Copy()
var/stack/S=new()
S.contents=src.contents.Copy()
return S
Clear()
contents.Cut()
-64
View File
@@ -45,70 +45,6 @@ length to avoid portals or something i guess?? Not that they're counted right no
// 4) adjacent = "/turf/proc/AdjacentTurfsSpace" and distance = "/turf/proc/Distance"
// Same as 1), but check all turf, including unsimulated
//////////////////////
//PriorityQueue object
//////////////////////
//an ordered list, using the cmp proc to weight the list elements
/PriorityQueue
var/list/L //the actual queue
var/cmp //the weight function used to order the queue
/PriorityQueue/New(compare)
L = new()
cmp = compare
/PriorityQueue/proc/IsEmpty()
return !L.len
//add an element in the list,
//immediatly ordering it to its position using Insertion sort
/PriorityQueue/proc/Enqueue(atom/A)
var/i
L.Add(A)
i = L.len -1
while(i > 0 && call(cmp)(L[i],A) >= 0) //place the element at it's right position using the compare proc
L.Swap(i,i+1) //last inserted element being first in case of ties (optimization)
i--
//removes and returns the first element in the queue
/PriorityQueue/proc/Dequeue()
if(!L.len)
return 0
. = L[1]
Remove(.)
return .
//removes an element
/PriorityQueue/proc/Remove(atom/A)
return L.Remove(A)
//returns a copy of the elements list
/PriorityQueue/proc/List()
var/list/ret = L.Copy()
return ret
//return the position of an element or 0 if not found
/PriorityQueue/proc/Seek(atom/A)
return L.Find(A)
//return the element at the i_th position
/PriorityQueue/proc/Get(i)
if(i > L.len || i < 1)
return 0
return L[i]
//replace the passed element at it's right position using the cmp proc
/PriorityQueue/proc/ReSort(atom/A)
var/i = Seek(A)
if(i == 0)
return
while(i < L.len && call(cmp)(L[i],L[i+1]) > 0)
L.Swap(i,i+1)
i++
while(i > 1 && call(cmp)(L[i],L[i-1]) <= 0) //last inserted element being first in case of ties (optimization)
L.Swap(i,i-1)
i--
//////////////////////
//PathNode object
+6 -1
View File
@@ -130,6 +130,12 @@
#undef CHAT_PULLR
/world/Reboot(var/reason, var/feedback_c, var/feedback_r, var/time)
if (reason == 1) //special reboot, do none of the normal stuff
if (usr)
log_admin("[key_name(usr)] Has requested an immediate world restart via client side debugging tools")
message_admins("[key_name_admin(usr)] Has requested an immediate world restart via client side debugging tools")
world << "<span class='boldannounce'>Rebooting World immediately due to host request</span>"
return ..(1)
var/delay
if(time)
delay = time
@@ -166,7 +172,6 @@
C << link("byond://[config.server]")
..(0)
/world/proc/load_mode()
var/list/Lines = file2list("data/mode.txt")
if(Lines.len)
+24
View File
@@ -60,6 +60,12 @@
<ul class="changes bgimages16">
<li class="tweak">Changelings' Digital Camoflague ability now renders them totally invisible to the AI</li>
</ul>
<h3 class="author">ExcessiveUseOfCobblestone updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Added health analyzer to the autolathe.</li>
<li class="tweak">Moved Cloning board to Medical Machinery section.</li>
<li class="tweak">Moved Telesci stuff to Teleporter section.</li>
</ul>
<h3 class="author">Fox P McCloud updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Adds the emitter board to to the circuit imprinter for R&D.</li>
@@ -77,9 +83,27 @@
<ul class="changes bgimages16">
<li class="tweak">Edaggers actually work now and have been buffed to 18 brute and 2 TC.</li>
</ul>
<h3 class="author">Oisin100 updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Nanotransen discover ancient human knowledge confirming that trees produce Oxygen From Carbon Dioxide</li>
<li class="tweak">Trees now require Oxygen to live. And will die in extreme temperatures</li>
</ul>
<h3 class="author">Xhuis updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">The arcade machines have been stocked with a xenomorph action figure that comes with realistic sounds!</li>
<li class="rscadd">Darksight now has its own icon.</li>
<li class="rscadd">Empowered thralls have been added. While obvious, they are more powerful and can resist dethralling while conscious. Only 5 can exist at one time.</li>
<li class="rscadd">Shadowlings can now change their night vision radius by using the action button their eyes (glasses) now provide.</li>
<li class="tweak">Torches are dimmer, being as bright as flashlights, and no longer fit on belts.</li>
<li class="tweak">Black Recuperation now has a 1 minute cooldown, down from 5. It can also be used to empower living thralls.</li>
<li class="tweak">Guise can now be used outside of darkness and makes the user more invisible than before.</li>
<li class="bugfix">Enthrall now functions properly when a shadowling is not hatched, allowing them to enthrall up to 5 people before hatching.</li>
</ul>
<h3 class="author">xxalpha updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Blood crawling is now a spell.</li>
<li class="rscadd">Engineering cyborgs now have a constant magpulse.</li>
<li class="tweak">Changed foam spreading to be like gas spreading.</li>
</ul>
<h2 class="date">28 August 2015</h2>
+25
View File
@@ -1657,6 +1657,10 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
Dorsidwarf:
- tweak: Changelings' Digital Camoflague ability now renders them totally invisible
to the AI
ExcessiveUseOfCobblestone:
- rscadd: Added health analyzer to the autolathe.
- tweak: Moved Cloning board to Medical Machinery section.
- tweak: Moved Telesci stuff to Teleporter section.
Fox P McCloud:
- tweak: Adds the emitter board to to the circuit imprinter for R&D.
Gun Hog:
@@ -1670,6 +1674,27 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
to disguise the goggles to match your job.
Miauw:
- tweak: Edaggers actually work now and have been buffed to 18 brute and 2 TC.
Oisin100:
- rscadd: Nanotransen discover ancient human knowledge confirming that trees produce
Oxygen From Carbon Dioxide
- tweak: Trees now require Oxygen to live. And will die in extreme temperatures
Xhuis:
- rscadd: The arcade machines have been stocked with a xenomorph action figure that
comes with realistic sounds!
- rscadd: Darksight now has its own icon.
- rscadd: Empowered thralls have been added. While obvious, they are more powerful
and can resist dethralling while conscious. Only 5 can exist at one time.
- rscadd: Shadowlings can now change their night vision radius by using the action
button their eyes (glasses) now provide.
- tweak: Torches are dimmer, being as bright as flashlights, and no longer fit on
belts.
- tweak: Black Recuperation now has a 1 minute cooldown, down from 5. It can also
be used to empower living thralls.
- tweak: Guise can now be used outside of darkness and makes the user more invisible
than before.
- bugfix: Enthrall now functions properly when a shadowling is not hatched, allowing
them to enthrall up to 5 people before hatching.
xxalpha:
- tweak: Blood crawling is now a spell.
- rscadd: Engineering cyborgs now have a constant magpulse.
- tweak: Changed foam spreading to be like gas spreading.
-8
View File
@@ -1,8 +0,0 @@
author: Oisin100
delete-after: True
changes:
- rscadd: "Nanotransen discover ancient human knowledge confirming that trees produce Oxygen From Carbon Dioxide"
- tweak: "Trees now require Oxygen to live. And will die in extreme temperatures"
@@ -22,7 +22,7 @@
#################################
# Your name.
author: ExcessiveUseOfCobblestone
author: Shadowlight213
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
@@ -33,6 +33,4 @@ delete-after: True
# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit.
# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog.
changes:
- rscadd: "Added health analyzer to the autolathe."
- tweak: "Moved Cloning board to Medical Machinery section."
- tweak: "Moved Telesci stuff to Teleporter section."
- rscadd: "The syndicate have taken notice of the camera bug's woeful underuse, and have managed to combine all of its upgrades into one!"
-11
View File
@@ -1,11 +0,0 @@
author: Xhuis
delete-after: True
changes:
- rscadd: "Darksight now has its own icon."
- rscadd: "Empowered thralls have been added. While obvious, they are more powerful and can resist dethralling while conscious. Only 5 can exist at one time."
- rscadd: "Shadowlings can now change their night vision radius by using the action button their eyes (glasses) now provide."
- tweak: "Torches are dimmer, being as bright as flashlights, and no longer fit on belts."
- tweak: "Black Recuperation now has a 1 minute cooldown, down from 5. It can also be used to empower living thralls."
- tweak: "Guise can now be used outside of darkness and makes the user more invisible than before."
- bugfix: "Enthrall now functions properly when a shadowling is not hatched, allowing them to enthrall up to 5 people before hatching."
-6
View File
@@ -1,6 +0,0 @@
author: xxalpha
delete-after: True
changes:
- rscadd: "Engineering cyborgs now have a constant magpulse."
Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 271 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 243 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 226 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 234 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 289 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 249 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 249 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 226 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 260 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 246 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 241 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 242 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 242 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 247 B

+1
View File
@@ -55,6 +55,7 @@ h1.alert, h2.alert {color: #000000;}
.warning {color: #ff0000; font-style: italic;}
.announce {color: #228b22; font-weight: bold;}
.boldannounce {color: #ff0000; font-weight: bold;}
.greenannounce {color: #00ff00; font-weight: bold;}
.rose {color: #ff5050;}
.info {color: #0000CC;}
.notice {color: #000099;}
+4 -1
View File
@@ -17,6 +17,9 @@
#include "code\_compile_options.dm"
#include "code\hub.dm"
#include "code\world.dm"
#include "code\__DATASTRUCTURES\linked_lists.dm"
#include "code\__DATASTRUCTURES\priority_queue.dm"
#include "code\__DATASTRUCTURES\stacks.dm"
#include "code\__DEFINES\admin.dm"
#include "code\__DEFINES\atmospherics.dm"
#include "code\__DEFINES\clothing.dm"
@@ -224,6 +227,7 @@
#include "code\datums\helper_datums\topic_input.dm"
#include "code\datums\spells\area_teleport.dm"
#include "code\datums\spells\barnyard.dm"
#include "code\datums\spells\bloodcrawl.dm"
#include "code\datums\spells\charge.dm"
#include "code\datums\spells\conjure.dm"
#include "code\datums\spells\construct_spells.dm"
@@ -1476,7 +1480,6 @@
#include "code\modules\scripting\Errors.dm"
#include "code\modules\scripting\IDE.dm"
#include "code\modules\scripting\Options.dm"
#include "code\modules\scripting\stack.dm"
#include "code\modules\scripting\AST\AST Nodes.dm"
#include "code\modules\scripting\AST\Blocks.dm"
#include "code\modules\scripting\AST\Statements.dm"