From c39957caa585f4fb0d7a0dffbdeb3912bdb3438c Mon Sep 17 00:00:00 2001 From: Remie Richards Date: Wed, 26 Aug 2015 01:17:51 +0100 Subject: [PATCH 01/22] Datastructures! * Moves PriorityQueue data structure out of the AStar file, and into it's own file in /__DATSTRUCTURES * Adds Stacks, a data structure, to /__DATASTRUCTURES * Adds Linked Lists, a data structure, to /__DATASTRUCTURES --- code/__DATASTRUCTURES/linked_lists.dm | 185 ++++++++++++++++++++++++ code/__DATASTRUCTURES/priority_queue.dm | 65 +++++++++ code/__DATASTRUCTURES/stacks.dm | 55 +++++++ code/orphaned procs/AStar.dm | 64 -------- tgstation.dme | 3 + 5 files changed, 308 insertions(+), 64 deletions(-) create mode 100644 code/__DATASTRUCTURES/linked_lists.dm create mode 100644 code/__DATASTRUCTURES/priority_queue.dm create mode 100644 code/__DATASTRUCTURES/stacks.dm diff --git a/code/__DATASTRUCTURES/linked_lists.dm b/code/__DATASTRUCTURES/linked_lists.dm new file mode 100644 index 00000000000..7a7f6519800 --- /dev/null +++ b/code/__DATASTRUCTURES/linked_lists.dm @@ -0,0 +1,185 @@ + +//Ok so it's technically a double linked list, bite me. + +/datum/linked_list + var/datum/linked_element/head + var/datum/linked_element/tail + var/element_amt = 0 + + +/datum/linked_element + var/value = null + var/datum/linked_list/linked_list = null + var/datum/linked_element/next_element_pointer = null + var/datum/linked_element/previous_element_pointer = null + + +/datum/linked_list/proc/is_empty() + . = element_amt ? 0 : 1 + + +//Add a linked_element (or value, creating a linked_element) at position +//the added element BECOMES the position-th element, +//eg: add("Test",5), the 5th element is now "Test", the previous 5th moves up to become the 6th +/datum/linked_list/proc/add(element, position) + var/datum/linked_element/adding + if(istype(element, /datum/linked_element)) + adding = element + else + adding = new() + adding.value = element + + if(!adding.linked_list || (adding.linked_list && (adding.linked_list != src))) + element_amt++ + + adding.linked_list = src + + if(position && position < element_amt) + //Replacing head + if(position == 1) + if(head) + head.previous_element_pointer = adding + adding.next_element_pointer = head + head = adding + + //Replacing any middle element + else + var/location = 0 + var/datum/linked_element/at + while((location != position) && (location <= element_amt)) + if(at) + if(at.next_element_pointer) + at = at.next_element_pointer + else + break + else + at = head + location++ + + //Push at up and assume it's place as the position-th element + if(at && at.previous_element_pointer) + at.previous_element_pointer.next_element_pointer = adding + adding.previous_element_pointer = at.previous_element_pointer + at.previous_element_pointer = adding + adding.next_element_pointer = at + return + + //Replacing tail + if(tail) + tail.next_element_pointer = adding + adding.previous_element_pointer = tail + if(!tail.previous_element_pointer) + head = tail + tail = adding + + + +//Remove a linked_element or the linked_element of a value +//If you specify a value the FIRST ONE is removed +/datum/linked_list/proc/remove(element) + var/datum/linked_element/removing + if(istype(element,/datum/linked_element)) + removing = element + 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_element/at = null + while((current_value != element) && (location <= element_amt)) + if(at) + if(at.next_element_pointer) + at = at.next_element_pointer + else + at = head + location++ + if(at) + current_value = at.value + if(current_value == element) + removing = at + break + + //Adjust pointers of where removing -was- in the chain. + if(removing) + if(removing.previous_element_pointer) + if(removing == tail) + tail = removing.previous_element_pointer + if(removing.next_element_pointer) + if(removing == head) + head = removing.next_element_pointer + removing.next_element_pointer.previous_element_pointer = removing.previous_element_pointer + removing.previous_element_pointer.next_element_pointer = removing.next_element_pointer + else + removing.previous_element_pointer.next_element_pointer = null + else + if(removing.next_element_pointer) + if(removing == head) + head = removing.next_element_pointer + removing.next_element_pointer.previous_element_pointer = null + + //if this is still true at this point, there's no more elements to replace them with + if(removing == head) + head = null + if(removing == tail) + tail = null + + removing.next_element_pointer = null + removing.previous_element_pointer = null + if(removing.linked_list == src) + element_amt-- + removing.linked_list = null + + return removing + return 0 + + +//Removes and deletes a element +/datum/linked_list/proc/removeDelete(element) + var/datum/linked_element/dead = remove(element) + if(dead) + qdel(dead) + return 1 + return 0 + + +//Empty the linked_list, deleting all elements +/datum/linked_list/proc/empty() + var/datum/linked_element/e = head + while(e) + var/next = e.next_element_pointer + remove(e) + qdel(e) + e = next + element_amt = 0 + + +//Some debugging tools +/datum/linked_list/proc/check_node_links() + var/datum/linked_element/e = head + while(e) + . = "|[e.value]|" + if(e.previous_element_pointer) + . = "[e.previous_element_pointer.value]<-" + . + if(e.next_element_pointer) + . += "->[e.next_element_pointer.value]" + e = e.next_element_pointer + . += "
" + +/datum/linked_list/proc/draw_node_links() + . = "|<-" + var/datum/linked_element/e = head + while(e) + if(e.previous_element_pointer) + . += "<-" + . += "[e.value]" + if(e.next_element_pointer) + . += "->" + e = e.next_element_pointer + . += "->|" + + + diff --git a/code/__DATASTRUCTURES/priority_queue.dm b/code/__DATASTRUCTURES/priority_queue.dm new file mode 100644 index 00000000000..2983924e0a1 --- /dev/null +++ b/code/__DATASTRUCTURES/priority_queue.dm @@ -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-- \ No newline at end of file diff --git a/code/__DATASTRUCTURES/stacks.dm b/code/__DATASTRUCTURES/stacks.dm new file mode 100644 index 00000000000..21f079e48df --- /dev/null +++ b/code/__DATASTRUCTURES/stacks.dm @@ -0,0 +1,55 @@ + +//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 "" +#define STACK_UNDERFLOW null + + +/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/peek() + if(is_empty()) + return STACK_UNDERFLOW + . = stack[stack.len] + +/datum/stack/proc/is_empty() + . = stack.len ? 0 : 1 + +//Rotate entire stack left with the leftmost looping around to the right +/datum/stack/proc/rotate_left() + 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/rotate_right() + if(is_empty()) + return 0 + . = stack[stack.len] + stack.Cut(stack.len,0) + stack.Insert(1,.) + + diff --git a/code/orphaned procs/AStar.dm b/code/orphaned procs/AStar.dm index 4f79d75e9d7..da152bdc8a0 100644 --- a/code/orphaned procs/AStar.dm +++ b/code/orphaned procs/AStar.dm @@ -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 diff --git a/tgstation.dme b/tgstation.dme index 383abb503be..55262d42579 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -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" From 5661d05290264103e48539e19de8462a284bb7bb Mon Sep 17 00:00:00 2001 From: Remie Richards Date: Fri, 28 Aug 2015 16:52:22 +0100 Subject: [PATCH 02/22] /datum/stack replaces /stack, naming scheme redo for procs and linked_element --> linked_node --- code/__DATASTRUCTURES/linked_lists.dm | 178 +++++++++--------- code/__DATASTRUCTURES/stacks.dm | 31 +-- code/modules/scripting/Errors.dm | 2 +- .../scripting/Interpreter/Interpreter.dm | 2 +- code/modules/scripting/Parser/Expressions.dm | 6 +- code/modules/scripting/Parser/Parser.dm | 2 +- code/modules/scripting/stack.dm | 23 --- tgstation.dme | 1 - 8 files changed, 118 insertions(+), 127 deletions(-) delete mode 100644 code/modules/scripting/stack.dm diff --git a/code/__DATASTRUCTURES/linked_lists.dm b/code/__DATASTRUCTURES/linked_lists.dm index 7a7f6519800..eccc3c422a8 100644 --- a/code/__DATASTRUCTURES/linked_lists.dm +++ b/code/__DATASTRUCTURES/linked_lists.dm @@ -2,54 +2,54 @@ //Ok so it's technically a double linked list, bite me. /datum/linked_list - var/datum/linked_element/head - var/datum/linked_element/tail - var/element_amt = 0 + var/datum/linked_node/head + var/datum/linked_node/tail + var/node_amt = 0 -/datum/linked_element +/datum/linked_node var/value = null var/datum/linked_list/linked_list = null - var/datum/linked_element/next_element_pointer = null - var/datum/linked_element/previous_element_pointer = null + var/datum/linked_node/next_node = null + var/datum/linked_node/previous_node = null -/datum/linked_list/proc/is_empty() - . = element_amt ? 0 : 1 +/datum/linked_list/proc/IsEmpty() + . = (node_amt <= 0) -//Add a linked_element (or value, creating a linked_element) at position -//the added element BECOMES the position-th element, -//eg: add("Test",5), the 5th element is now "Test", the previous 5th moves up to become the 6th -/datum/linked_list/proc/add(element, position) - var/datum/linked_element/adding - if(istype(element, /datum/linked_element)) - adding = element +//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 = element + adding.value = node if(!adding.linked_list || (adding.linked_list && (adding.linked_list != src))) - element_amt++ + node_amt++ adding.linked_list = src - if(position && position < element_amt) + if(position && position < node_amt) //Replacing head if(position == 1) if(head) - head.previous_element_pointer = adding - adding.next_element_pointer = head + head.previous_node = adding + adding.next_node = head head = adding - //Replacing any middle element + //Replacing any middle node else var/location = 0 - var/datum/linked_element/at - while((location != position) && (location <= element_amt)) + var/datum/linked_node/at + while((location != position) && (location <= node_amt)) if(at) - if(at.next_element_pointer) - at = at.next_element_pointer + if(at.next_node) + at = at.next_node else break else @@ -57,29 +57,29 @@ location++ //Push at up and assume it's place as the position-th element - if(at && at.previous_element_pointer) - at.previous_element_pointer.next_element_pointer = adding - adding.previous_element_pointer = at.previous_element_pointer - at.previous_element_pointer = adding - adding.next_element_pointer = at + 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_element_pointer = adding - adding.previous_element_pointer = tail - if(!tail.previous_element_pointer) + tail.next_node = adding + adding.previous_node = tail + if(!tail.previous_node) head = tail tail = adding -//Remove a linked_element or the linked_element of a value +//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(element) - var/datum/linked_element/removing - if(istype(element,/datum/linked_element)) - removing = element +/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) @@ -89,97 +89,103 @@ else var/location = 1 var/current_value = null - var/datum/linked_element/at = null - while((current_value != element) && (location <= element_amt)) + var/datum/linked_node/at = null + while((current_value != node) && (location <= node_amt)) if(at) - if(at.next_element_pointer) - at = at.next_element_pointer + if(at.next_node) + at = at.next_node else at = head location++ if(at) current_value = at.value - if(current_value == element) + if(current_value == node) removing = at break //Adjust pointers of where removing -was- in the chain. if(removing) - if(removing.previous_element_pointer) + if(removing.previous_node) if(removing == tail) - tail = removing.previous_element_pointer - if(removing.next_element_pointer) + tail = removing.previous_node + if(removing.next_node) if(removing == head) - head = removing.next_element_pointer - removing.next_element_pointer.previous_element_pointer = removing.previous_element_pointer - removing.previous_element_pointer.next_element_pointer = removing.next_element_pointer + head = removing.next_node + removing.next_node.previous_node = removing.previous_node + removing.previous_node.next_node = removing.next_node else - removing.previous_element_pointer.next_element_pointer = null + removing.previous_node.next_node = null else - if(removing.next_element_pointer) + if(removing.next_node) if(removing == head) - head = removing.next_element_pointer - removing.next_element_pointer.previous_element_pointer = null + head = removing.next_node + removing.next_node.previous_node = null - //if this is still true at this point, there's no more elements to replace them with + //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_element_pointer = null - removing.previous_element_pointer = null + removing.next_node = null + removing.previous_node = null if(removing.linked_list == src) - element_amt-- + node_amt-- removing.linked_list = null return removing return 0 -//Removes and deletes a element -/datum/linked_list/proc/removeDelete(element) - var/datum/linked_element/dead = remove(element) +//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 elements -/datum/linked_list/proc/empty() - var/datum/linked_element/e = head - while(e) - var/next = e.next_element_pointer - remove(e) - qdel(e) - e = next - element_amt = 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/check_node_links() - var/datum/linked_element/e = head - while(e) - . = "|[e.value]|" - if(e.previous_element_pointer) - . = "[e.previous_element_pointer.value]<-" + . - if(e.next_element_pointer) - . += "->[e.next_element_pointer.value]" - e = e.next_element_pointer +/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 . += "
" -/datum/linked_list/proc/draw_node_links() + +/datum/linked_list/proc/DrawNodeLinks() . = "|<-" - var/datum/linked_element/e = head - while(e) - if(e.previous_element_pointer) + var/datum/linked_node/n = head + while(n) + if(n.previous_node) . += "<-" - . += "[e.value]" - if(e.next_element_pointer) + . += "[n.value]" + if(n.next_node) . += "->" - e = e.next_element_pointer + n = n.next_node . += "->|" - +/datum/linked_list/proc/ToList() + . = list() + var/datum/linked_node/n = head + while(n) + . += n + n = n.next_node \ No newline at end of file diff --git a/code/__DATASTRUCTURES/stacks.dm b/code/__DATASTRUCTURES/stacks.dm index 21f079e48df..64280ec7006 100644 --- a/code/__DATASTRUCTURES/stacks.dm +++ b/code/__DATASTRUCTURES/stacks.dm @@ -1,9 +1,9 @@ //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 "" -#define STACK_UNDERFLOW null +//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 @@ -17,35 +17,35 @@ if(max) max_elements = max -/datum/stack/proc/pop() +/datum/stack/proc/Pop() if(is_empty()) return STACK_UNDERFLOW . = stack[stack.len] stack.Cut(stack.len,0) -/datum/stack/proc/push(element) +/datum/stack/proc/Push(element) if(max_elements && (stack.len+1 > max_elements)) return STACK_OVERFLOW stack += element -/datum/stack/proc/peek() +/datum/stack/proc/Top() if(is_empty()) return STACK_UNDERFLOW . = stack[stack.len] /datum/stack/proc/is_empty() - . = stack.len ? 0 : 1 + . = (stack.len > 0) //Rotate entire stack left with the leftmost looping around to the right -/datum/stack/proc/rotate_left() +/datum/stack/proc/RotateLeft() if(is_empty()) return 0 . = stack[1] stack.Cut(1,2) - push(.) + Push(.) //Rotate entire stack to the right with the rightmost looping around to the left -/datum/stack/proc/rotate_right() +/datum/stack/proc/RotateRight() if(is_empty()) return 0 . = stack[stack.len] @@ -53,3 +53,12 @@ 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() diff --git a/code/modules/scripting/Errors.dm b/code/modules/scripting/Errors.dm index ed9d73b4e31..3b2b5a7de70 100644 --- a/code/modules/scripting/Errors.dm +++ b/code/modules/scripting/Errors.dm @@ -81,7 +81,7 @@ A basic description as to what went wrong. */ message - stack/stack + datum/stack/stack proc /* diff --git a/code/modules/scripting/Interpreter/Interpreter.dm b/code/modules/scripting/Interpreter/Interpreter.dm index 9aacf4f19f0..7b1b34ca81c 100644 --- a/code/modules/scripting/Interpreter/Interpreter.dm +++ b/code/modules/scripting/Interpreter/Interpreter.dm @@ -21,7 +21,7 @@ node BlockDefinition/program statement/FunctionDefinition/curFunction - stack + datum/stack scopes = new() functions = new() diff --git a/code/modules/scripting/Parser/Expressions.dm b/code/modules/scripting/Parser/Expressions.dm index 18245cac9c3..9386786a376 100644 --- a/code/modules/scripting/Parser/Expressions.dm +++ b/code/modules/scripting/Parser/Expressions.dm @@ -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 @@ - */ ParseExpression(list/end=list(/token/end), list/ErrChars=list("{", "}"), check_functions = 0) - var/stack + var/datum/stack opr=new val=new src.expecting=VALUE diff --git a/code/modules/scripting/Parser/Parser.dm b/code/modules/scripting/Parser/Parser.dm index b3c6b8ac3c9..e2459cc9202 100644 --- a/code/modules/scripting/Parser/Parser.dm +++ b/code/modules/scripting/Parser/Parser.dm @@ -37,7 +37,7 @@ The token at in . */ curToken - stack + datum/stack blocks=new node/BlockDefinition GlobalBlock/global_block=new diff --git a/code/modules/scripting/stack.dm b/code/modules/scripting/stack.dm deleted file mode 100644 index efea746e47a..00000000000 --- a/code/modules/scripting/stack.dm +++ /dev/null @@ -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() \ No newline at end of file diff --git a/tgstation.dme b/tgstation.dme index 55262d42579..8b493692762 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1476,7 +1476,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" From 0009ad729aec77202b7c4b62d4e90fa3d6135ac3 Mon Sep 17 00:00:00 2001 From: AnturK Date: Sat, 29 Aug 2015 14:26:58 +0200 Subject: [PATCH 03/22] fixes wizard not recieving nuke kit --- code/game/gamemodes/wizard/wizard.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 6ed742e75a4..c500f390b6a 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -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) From 59792ca682ef86a5e8a3660960db0e7f4b438367 Mon Sep 17 00:00:00 2001 From: AnturK Date: Sun, 30 Aug 2015 13:15:58 +0200 Subject: [PATCH 04/22] voodoo doll fixes --- code/game/gamemodes/wizard/artefact.dm | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index c053983d4c0..237fc4a63a2 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -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 << "You remove the [link] from the doll." + 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 << "You suddenly feel as if your head was hit with a hammer!" GiveHint(target,user) - if("chest") - if(link) - target = null - link.loc = get_turf(src) - user << "You remove the [link] from the doll." - link = null - update_targets() cooldown = world.time + cooldown_time /obj/item/voodoo/proc/update_targets() From 3868bcdb23a3fc735a5377cad07067630c953564 Mon Sep 17 00:00:00 2001 From: Maarten van den Berg Date: Sun, 30 Aug 2015 14:59:13 +0200 Subject: [PATCH 05/22] Adds check whether floor has been reinforced before using rods --- code/game/turfs/simulated/floor/plating.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index e941b5f6af4..32a43d63195 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -39,7 +39,7 @@ else user << "You begin reinforcing the floor..." 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) From 2a933dd0b3d94c179a5de58d2a56ffbde61ef986 Mon Sep 17 00:00:00 2001 From: Maarten van den Berg Date: Sun, 30 Aug 2015 16:28:35 +0200 Subject: [PATCH 06/22] Adds check for empty message in guardian communicate verbs --- code/modules/mob/living/simple_animal/guardian/guardian.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index ea02c118e75..f0868f2ad23 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -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)) From 12a7ebb776551ff75d06ee0282663dfd14f346d0 Mon Sep 17 00:00:00 2001 From: Nerd Lord Date: Sun, 30 Aug 2015 19:54:55 -0400 Subject: [PATCH 07/22] STOP BOMBING THE FUCKING BLOB, ASSHOLE Also gives blob types and mobs better descriptions because WOW these were bad. --- code/game/gamemodes/blob/blobs/blob_mobs.dm | 4 ++-- code/game/gamemodes/blob/blobs/core.dm | 5 +++++ code/game/gamemodes/blob/blobs/factory.dm | 1 + code/game/gamemodes/blob/blobs/node.dm | 1 + code/game/gamemodes/blob/blobs/resource.dm | 1 + code/game/gamemodes/blob/blobs/shield.dm | 3 ++- code/game/gamemodes/blob/blobs/storage.dm | 1 + code/game/gamemodes/blob/theblob.dm | 3 ++- code/game/objects/explosion.dm | 6 ++++++ 9 files changed, 21 insertions(+), 4 deletions(-) diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index 440967945ab..97d61898b37 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -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 @@ -145,7 +145,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" diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm index b19965f3d3e..ec7ed02ece8 100644 --- a/code/game/gamemodes/blob/blobs/core.dm +++ b/code/game/gamemodes/blob/blobs/core.dm @@ -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) diff --git a/code/game/gamemodes/blob/blobs/factory.dm b/code/game/gamemodes/blob/blobs/factory.dm index 90dab3c0fe2..e89afd34300 100644 --- a/code/game/gamemodes/blob/blobs/factory.dm +++ b/code/game/gamemodes/blob/blobs/factory.dm @@ -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() diff --git a/code/game/gamemodes/blob/blobs/node.dm b/code/game/gamemodes/blob/blobs/node.dm index 423272ed8b6..5da503da5df 100644 --- a/code/game/gamemodes/blob/blobs/node.dm +++ b/code/game/gamemodes/blob/blobs/node.dm @@ -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 diff --git a/code/game/gamemodes/blob/blobs/resource.dm b/code/game/gamemodes/blob/blobs/resource.dm index 78527b7cde0..2996265ee2c 100644 --- a/code/game/gamemodes/blob/blobs/resource.dm +++ b/code/game/gamemodes/blob/blobs/resource.dm @@ -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 diff --git a/code/game/gamemodes/blob/blobs/shield.dm b/code/game/gamemodes/blob/blobs/shield.dm index 1c145f4404f..387dda96048 100644 --- a/code/game/gamemodes/blob/blobs/shield.dm +++ b/code/game/gamemodes/blob/blobs/shield.dm @@ -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 = 4 fire_resist = 2 diff --git a/code/game/gamemodes/blob/blobs/storage.dm b/code/game/gamemodes/blob/blobs/storage.dm index 4b5089b10cc..a09e58915f3 100644 --- a/code/game/gamemodes/blob/blobs/storage.dm +++ b/code/game/gamemodes/blob/blobs/storage.dm @@ -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 diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index 907bf7e2c68..ce99589ffad 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -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 = 2 var/health = 30 var/health_timestamp = 0 var/brute_resist = 4 diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index 682fc5293fe..6d3c4e6dce0 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -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" From 7802332dcf919bbff26f099deb3ed554aeefdfff Mon Sep 17 00:00:00 2001 From: Nerd Lord Date: Sun, 30 Aug 2015 19:56:30 -0400 Subject: [PATCH 08/22] Actually nah touch lower, given how many there can be. --- code/game/gamemodes/blob/blobs/shield.dm | 2 +- code/game/gamemodes/blob/theblob.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/blob/blobs/shield.dm b/code/game/gamemodes/blob/blobs/shield.dm index 387dda96048..68e29f221ee 100644 --- a/code/game/gamemodes/blob/blobs/shield.dm +++ b/code/game/gamemodes/blob/blobs/shield.dm @@ -4,7 +4,7 @@ icon_state = "blob_idle" desc = "A solid wall of slightly twitching tendrils." health = 75 - explosion_block = 4 + explosion_block = 3 fire_resist = 2 diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index ce99589ffad..a217859035d 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -7,7 +7,7 @@ density = 0 opacity = 0 anchored = 1 - explosion_block = 2 + explosion_block = 1 var/health = 30 var/health_timestamp = 0 var/brute_resist = 4 From 877111b8e6b0dd4493b7c26a0aa0a53892400db4 Mon Sep 17 00:00:00 2001 From: palpatine213 Date: Sun, 30 Aug 2015 17:58:27 -0700 Subject: [PATCH 09/22] Removed upgrade mechanics from camera bugs. They come build in with networking, sabotage, and tracking upgrades. Also added camera disable button to track menu. --- code/datums/uplink_item.dm | 4 +- code/game/objects/items/devices/camera_bug.dm | 104 ++---------------- 2 files changed, 13 insertions(+), 95 deletions(-) diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index d7b6ef50879..2297c0cc484 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -471,7 +471,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 @@ -520,7 +520,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, \ diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm index 59780eb60f0..f91b7f2a75b 100644 --- a/code/game/objects/items/devices/camera_bug.dm +++ b/code/game/objects/items/devices/camera_bug.dm @@ -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 qdel(src) //Easier to just call del() than this nonsense // ya no, del() takes 0.8ds to run on avg. this takes less than 0.01 @@ -78,7 +65,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 << "[src] has lost the signal." current = null user.reset_view(null) @@ -88,22 +75,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 @@ -119,16 +97,10 @@ for(var/entry in cameras) var/obj/machinery/camera/C = cameras[entry] var/functions = "" - switch(bugtype) - if(SABOTAGE_BUG) - functions = " - \[Disable\]" - if(ADVANCED_BUG) - functions = " - \[Monitor\]" - if(ADMIN_BUG) - if(C.bug == src) - functions = " - \[Monitor\] \[Disable\]" - else - functions = " - \[Monitor\]" + if(C.bug == src) + functions = " - \[Monitor\] \[Disable\]" + else + functions = " - \[Monitor\]" html += "[entry][functions]" if(BUGMODE_MONITOR) @@ -157,6 +129,9 @@ var/s = (time_diff - 4*m) * 15 if(!s) s = "00" html += "Last seen near [outstring] ([m]:[s] minute\s ago)
" + if( C && (C.bug == src)) //Checks to see if the camera has a bug + html += "\[Disable\]" + else html += "Not yet seen." else @@ -309,63 +284,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 << "You unscrew [expansion]." - 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 << "You add [W] to [src]." - 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 From dd7b84228bb23c9476a3596a10685e61f52bba96 Mon Sep 17 00:00:00 2001 From: palpatine213 Date: Sun, 30 Aug 2015 18:30:55 -0700 Subject: [PATCH 10/22] Fixes infinite loop. --- code/game/objects/items/devices/camera_bug.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm index f91b7f2a75b..05715e9f376 100644 --- a/code/game/objects/items/devices/camera_bug.dm +++ b/code/game/objects/items/devices/camera_bug.dm @@ -35,7 +35,7 @@ SSobj.processing += src /obj/item/device/camera_bug/Destroy() - qdel(src) + //Easier to just call del() than this nonsense // ya no, del() takes 0.8ds to run on avg. this takes less than 0.01 get_cameras() From 4713b1440d4af04980e508b679c97372973b87bc Mon Sep 17 00:00:00 2001 From: Kyle Spier-Swenson Date: Mon, 31 Aug 2015 00:27:39 -0700 Subject: [PATCH 11/22] Fixes reboot world in dd or client side debugging tools acting odd. Using the server->reboot option in client side debugging tools will sleep the current proc and call world.Reboot(1). These cases should immediately reboot with no code to clog it up so that admins with client side debugging tools can restart the world even if its hung. (this being the reason i gave all admins client side debugging tools) --- code/world.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/world.dm b/code/world.dm index 9635e3fe995..b1d09abdd98 100644 --- a/code/world.dm +++ b/code/world.dm @@ -130,6 +130,9 @@ #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 + world << "Rebooting World immediately due to host request" + return ..(1) var/delay if(time) delay = time From b494d60ea255cc190388e7a17e5551ca99a6eff6 Mon Sep 17 00:00:00 2001 From: c0 Date: Mon, 31 Aug 2015 10:58:14 +0300 Subject: [PATCH 12/22] Removes unused SpiderOS icons --- code/modules/client/client procs.dm | 14 -------------- icons/spideros_icons/sos_1.png | Bin 271 -> 0 bytes icons/spideros_icons/sos_10.png | Bin 243 -> 0 bytes icons/spideros_icons/sos_11.png | Bin 226 -> 0 bytes icons/spideros_icons/sos_12.png | Bin 234 -> 0 bytes icons/spideros_icons/sos_13.png | Bin 289 -> 0 bytes icons/spideros_icons/sos_14.png | Bin 249 -> 0 bytes icons/spideros_icons/sos_2.png | Bin 249 -> 0 bytes icons/spideros_icons/sos_3.png | Bin 226 -> 0 bytes icons/spideros_icons/sos_4.png | Bin 260 -> 0 bytes icons/spideros_icons/sos_5.png | Bin 246 -> 0 bytes icons/spideros_icons/sos_6.png | Bin 241 -> 0 bytes icons/spideros_icons/sos_7.png | Bin 242 -> 0 bytes icons/spideros_icons/sos_8.png | Bin 242 -> 0 bytes icons/spideros_icons/sos_9.png | Bin 247 -> 0 bytes 15 files changed, 14 deletions(-) delete mode 100644 icons/spideros_icons/sos_1.png delete mode 100644 icons/spideros_icons/sos_10.png delete mode 100644 icons/spideros_icons/sos_11.png delete mode 100644 icons/spideros_icons/sos_12.png delete mode 100644 icons/spideros_icons/sos_13.png delete mode 100644 icons/spideros_icons/sos_14.png delete mode 100644 icons/spideros_icons/sos_2.png delete mode 100644 icons/spideros_icons/sos_3.png delete mode 100644 icons/spideros_icons/sos_4.png delete mode 100644 icons/spideros_icons/sos_5.png delete mode 100644 icons/spideros_icons/sos_6.png delete mode 100644 icons/spideros_icons/sos_7.png delete mode 100644 icons/spideros_icons/sos_8.png delete mode 100644 icons/spideros_icons/sos_9.png diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 6958f17e392..2f285925e8a 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -322,20 +322,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', diff --git a/icons/spideros_icons/sos_1.png b/icons/spideros_icons/sos_1.png deleted file mode 100644 index 079f548fde124ab71f5d390350827ac2ef115479..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|>?NMQuI#s2_(kNo^z&rC0fod% zTq8opx~-5_~k z38#_7hFM){>YH*kr1A_mG6`-{>fjLL<=~4Dlw$6l{D31;(1m{%_eE#U)x0gvoR?L9 zIB{m{B=W0@1lj~m$!hRUP!rHu*do(0qv=VO0w)8*OX1qtYcBFy0c~aQboFyt=akR{ E0Jow|B>(^b diff --git a/icons/spideros_icons/sos_10.png b/icons/spideros_icons/sos_10.png deleted file mode 100644 index 5f962d60f457e2169a28d432572209ee92c29084..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|>?NMQuI#s2_{A0V)nDdL1qz9m zxJHx&=ckpFCl;kLxcj&OjZr8|EmAPnGbwCc@(`$mqolyk9VlZAWHWd*XvzaAmUKs7 zM+SzC{oH>NS%G}EByV>YhW{YAVDIwDKoLJr7srr_ImrnM%xkV+ZC@PivnGQhQY@A^ zK&4n#DG0G8<=S czX}7xZo~SSYbX3t1Ded>>FVdQ&MBb@0L@59hyVZp diff --git a/icons/spideros_icons/sos_11.png b/icons/spideros_icons/sos_11.png deleted file mode 100644 index fd68c8a4ac229eea099ae84c6117a420ec79ea75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|>?NMQuI#s2_{Eh>+7^D_1r!o5 zag8Vm&QB{TPb^AhaQATm8lzB_TBKmCXHwX@!lvI6;RN#5=*4F5rJ!QSPQfg-k^E{-7;bCMGjnAcptsxEZV?Xa#|m_m~Q zM|Q($r!NT?8?IJc%J7ov?&T`5QC?y KpUXO@geCyrT0`Oh diff --git a/icons/spideros_icons/sos_12.png b/icons/spideros_icons/sos_12.png deleted file mode 100644 index ff3a064c03607888e9400533d29d001bf5f9a2aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|>?NMQuI#s21ekbu510g;0Sbwi zxJHx&=ckpFCl;kLxcj&OjZr8|EmAPnGbwCc@(`$mqolyk9VlZAWHWd*XvzaAmUKs7 zM+SzC{oH>NS%G}EByV>YhW{YAVDIwDKoM6@7srr_ImrnM%xkV+RToOU*br~;$Gc;T z;Dv^jz5k>**c7@nCKPseitd*aQS8W4=mPK#? diff --git a/icons/spideros_icons/sos_13.png b/icons/spideros_icons/sos_13.png deleted file mode 100644 index c396182cfeddfb16315b7035e62d26472c359a14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|>?NMQuI#s2*~QE(BG$970Sbwi zxJHx&=ckpFCl;kLxcj&OjZr8|EmAPnGbwCc@(`$mqolyk9VlZAWHWd*XvzaAmUKs7 zM+SzC{oH>NS%G}EByV>YhW{YAVDIwDK#>|x7srr_Iddm+a~)9NaZcUvxJS13`^`+X z5}RcELu#&DmU#w8|K9j6_x?NMQuI#tjm>DhgetCRz01Anh zxJHx&=ckpFCl;kLxcj&OjZr8|EmAPnGbwCc@(`$mqolyk9VlZAWHWd*XvzaAmUKs7 zM+SzC{oH>NS%G}EByV>YhW{YAVDIwDK#>qn7srr_ImrnM%xkV+RTo;AePETOFC!y& z;VOnn+h;^5a;#$y7C7p$qi%tT3(F$DZYh)PkJ1CgyiBe&cpLlqKjx}n@^j*=eqwR( iIeW~p;0KwL7#Lg+%v&z=%ij%XK7*&LpUXO@geCx@;7Ysz diff --git a/icons/spideros_icons/sos_2.png b/icons/spideros_icons/sos_2.png deleted file mode 100644 index 40009fe5622f15a7ce5e2fa6c20b34a2cf188a77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|>?NMQuI#s2_(e1%d@h{r0t$(j zxJHx&=ckpFCl;kLxcj&OjZr8|EmAPnGbwCc@(`$mqolyk9VlZAWHWd*XvzaAmUKs7 zM+SzC{oH>NS%G}EByV>YhW{YAVDIwDK#>qn7srr_ImrnM%xkV+RToOU&LFb$=n*cL zh@~5DH^k3j4CcsV4vS<?NMQuI#s2_(fFZ)1}l>fI{LW zt`Q}{`DrEPiAAXl?mjL+V-(6#ixiCYObT0i(P{h{L#WAE}PI7_*^P1~d-QBj&h?NMQuI#s2_(jw$+Z7K=1BJv( zTq8FVdQ&MBb@04BvtJOBUy diff --git a/icons/spideros_icons/sos_5.png b/icons/spideros_icons/sos_5.png deleted file mode 100644 index 7e43c9d8a4607e4e6d9827cc2d080174eabc4744..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|>?NMQuI#s2_(ilVTs!&?0ENU$ zTq81&oVw8kBF{a9G2ZVt!!iq1X;r=2?NMQuI#s2_(crFG>a>)0ENU$ zTq8qt6z?rUa zI%o~!p;isoG=U2Z$Ioiiq$p2hbP?$8j0jDhF4bZ-LDK8Qw1lU89c){^G|!wko Z?}&Ex&Qt4E4gk$%@O1TaS?83{1OP*XNUi_? diff --git a/icons/spideros_icons/sos_7.png b/icons/spideros_icons/sos_7.png deleted file mode 100644 index d93d2b13fec4b7629a5fdc8678d6bba1ffeee92d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|>?NMQuI#s2_{Dhi*%)JefkNUX zt`Q}{`DrEPiAAXl?mjL+V-(6#ixiCYObT0i(P{h~M#WAE}PI7_*^P1~d)rA6`59_LhnY8#b z2S{B$c%mx6bP0l+XkKhF?fB diff --git a/icons/spideros_icons/sos_8.png b/icons/spideros_icons/sos_8.png deleted file mode 100644 index fd540cb3a82b111c42bd66ca7aebef0b28906c39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|>?NMQuI#s2_{De)CJ80}1PY0l zxJHx&=ckpFCl;kLxcj&OjZr8|EmAPnGbwCc@(`$mqolyk9VlZAWHWd*XvzaAmUKs7 zM+SzC{oH>NS%G}EByV>YhW{YAVDIwDKoMV07srr_ImrnM%xkV+RTm0e#&}}K(IZ_e zIW#)fuq|X%YFx(dD{$8{?NMQuI#s2_{BN6G*+uw0)@m& zTq8aOf?AD--4;7;Px$Ml fpeyKCqr%8g`k^)~x3BXB&~ye*S3j3^P6 Date: Mon, 31 Aug 2015 20:55:12 +1000 Subject: [PATCH 13/22] makes auto_declare_completion_ use printplayer() --- code/game/gamemodes/abduction/abduction.dm | 4 +- code/game/gamemodes/blob/blob_finish.dm | 5 +- code/game/gamemodes/cult/cult.dm | 18 +++--- code/game/gamemodes/game_mode.dm | 14 +++-- code/game/gamemodes/gang/gang.dm | 41 ++++-------- .../game/gamemodes/malfunction/malfunction.dm | 14 +---- code/game/gamemodes/nuclear/nuclear.dm | 20 +----- code/game/gamemodes/revolution/revolution.dm | 63 ++----------------- code/game/gamemodes/shadowling/shadowling.dm | 10 +-- interface/stylesheet.dm | 1 + 10 files changed, 46 insertions(+), 144 deletions(-) diff --git a/code/game/gamemodes/abduction/abduction.dm b/code/game/gamemodes/abduction/abduction.dm index 8e6662109e3..0b710001f38 100644 --- a/code/game/gamemodes/abduction/abduction.dm +++ b/code/game/gamemodes/abduction/abduction.dm @@ -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 << "[team_name] team fullfilled its mission!" + world << "[team_name] team fullfilled its mission!" else - world << "[team_name] team failed its mission." + world << "[team_name] team failed its mission." ..() return 1 diff --git a/code/game/gamemodes/blob/blob_finish.dm b/code/game/gamemodes/blob/blob_finish.dm index 743196fbb2a..55f79d883b8 100644 --- a/code/game/gamemodes/blob/blob_finish.dm +++ b/code/game/gamemodes/blob/blob_finish.dm @@ -45,8 +45,7 @@ var/datum/game_mode/blob/blob_mode = src if(blob_mode.infected_crew.len) var/text = "The blob[(blob_mode.infected_crew.len > 1 ? "s were" : " was")]:" - for(var/datum/mind/blob in blob_mode.infected_crew) - text += "
[blob.key] was [blob.name]" + text += printplayer(blob) world << text - return 1 + return 1 \ No newline at end of file diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 50fac253f91..333142996be 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -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 << "The cult wins! It has succeeded in serving its dark masters!" + world << "The cult wins! It has succeeded in serving its dark masters!" else feedback_set_details("round_end_result","loss - staff stopped the cult") feedback_set("round_end_result",acolytes_survived) - world << "The staff managed to stop the cult!" + world << "The staff managed to stop the cult!" 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) Success!" + explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. ([acolytes_survived] escaped) Success!" 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) Fail." + explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. ([acolytes_survived] escaped) Fail." 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]. Success!" + explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. Success!" 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]. Fail." + explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. Fail." feedback_add_details("cult_objective","cult_sacrifice|FAIL") else - explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. Fail (Gibbed)." + explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. Fail (Gibbed)." feedback_add_details("cult_objective","cult_sacrifice|FAIL|GIBBED") if("eldergod") if(!eldergod) - explanation = "Summon Nar-Sie. Success!" + explanation = "Summon Nar-Sie. Success!" feedback_add_details("cult_objective","cult_narsie|SUCCESS") else - explanation = "Summon Nar-Sie. Fail." + explanation = "Summon Nar-Sie. Fail." feedback_add_details("cult_objective","cult_narsie|FAIL") text += "
Objective #[obj_count]: [explanation]" diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index f27e6522c59..b47f6b500c3 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -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 = "
[ply.key] was [ply.name] the [ply.assigned_role] and" if(ply.current) if(ply.current.stat == DEAD) - text += " died" + text += " died" else - text += " survived" + text += " survived" + if(fleecheck && ply.current.z > ZLEVEL_STATION) + text += " while fleeing the station" if(ply.current.real_name != ply.name) text += " as [ply.current.real_name]" else - text += " had their body destroyed" + text += " had their body destroyed" 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 += "
Objective #[count]: [objective.explanation_text] Success!" + text += "
Objective #[count]: [objective.explanation_text] Success!" else - text += "
Objective #[count]: [objective.explanation_text] Fail." + text += "
Objective #[count]: [objective.explanation_text] Fail." count++ return text diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm index a0373cc04dc..882d8bc422e 100644 --- a/code/game/gamemodes/gang/gang.dm +++ b/code/game/gamemodes/gang/gang.dm @@ -241,39 +241,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 << "The station was [station_was_nuked ? "destroyed!" : "evacuated before a gang could claim it! The station wins!"]
" + world << "The station was [station_was_nuked ? "destroyed!" : "evacuated before a gang could claim it! The station wins!"]
" else - world << "The [winner.name] Gang successfully performed a hostile takeover of the station!
" + world << "The [winner.name] Gang successfully performed a hostile takeover of the station!
" for(var/datum/gang/G in gangs) - world << "
The [G.name] Gang was [winner==G ? "victorious" : "defeated"] with [round((G.territory.len/start_state.num_territories)*100, 1)]% control of the station!" - world << "
The [G.name] Gang Bosses were:" - gang_membership_report(G.bosses) - world << "
The [G.name] Gangsters were:" - gang_membership_report(G.gangsters) - world << "
" - - - -/datum/game_mode/proc/gang_membership_report(list/membership) - var/text = "" - for(var/datum/mind/gang_mind in membership) - text += "
[gang_mind.key] was [gang_mind.name] (" - 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 [gang_mind.current.real_name]" - else - text += "body destroyed" - text += ")" - - world << text - + var/text = "The [G.name] Gang was [winner==G ? "victorious" : "defeated"] with [round((G.territory.len/start_state.num_territories)*100, 1)]% control of the station!" + text += "
The [G.name] Gang Bosses were:" + for(var/datum/mind/boss in G.bosses) + text += printplayer(boss, 1) + text += "
The [G.name] Gangsters were:" + for(var/datum/mind/gangster in G.gangsters) + text += printplayer(gangster, 1) + text += "
" + world << text ////////////////////////////////////////////////////////// //Handles influence, territories, and the victory checks// diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index 5a88c2e0525..6c6c06e84c5 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -286,24 +286,12 @@ if( malf_ai.len || istype(ticker.mode,/datum/game_mode/malfunction) ) var/text = "
The malfunctioning AIs were:" var/module_text_temp = "
Purchased modules:
" //Added at the end - for(var/datum/mind/malf in malf_ai) - - text += "
[malf.key] was [malf.name] (" + 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 [malf.current.real_name]" var/mob/living/silicon/ai/AI = malf.current for(var/datum/AI_Module/mod in AI.current_modules) module_text_temp += mod.module_name + "
" - else - text += "hardware destroyed" - text += ")" text += module_text_temp - world << text return 1 diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index ceb70737d79..939cce46b06 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -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 = "
The syndicate operatives were:" - var/purchases = "" var/TC_uses = 0 - for(var/datum/mind/syndicate in syndicates) - - text += "
[syndicate.key] was [syndicate.name] (" - if(syndicate.current) - if(syndicate.current.stat == DEAD) - text += "died" - else - text += "survived" - if(syndicate.current.real_name != syndicate.name) - text += " as [syndicate.current.real_name]" - 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 += "
" - text += "(Syndicates used [TC_uses] TC) [purchases]" - if(TC_uses==0 && station_was_nuked && !are_operatives_dead()) text += "" - world << text return 1 diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index f2b121456ff..99c59e476b5 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -314,16 +314,15 @@ /datum/game_mode/revolution/declare_completion() if(finished == 1) feedback_set_details("round_end_result","win - heads killed") - world << "The heads of staff were killed or exiled! The revolutionaries win!" + world << "The heads of staff were killed or exiled! The revolutionaries win!" else if(finished == 2) feedback_set_details("round_end_result","loss - rev heads killed") - world << "The heads of staff managed to stop the revolution!" + world << "The heads of staff managed to stop the revolution!" ..() 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 @@ -333,78 +332,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: [100 - round((num_revs/num_survivors)*100, 0.1)]%" // % of loyal crew - var/text = "
The head revolutionaries were:" - for(var/datum/mind/headrev in head_revolutionaries) - text += "
[headrev.key] was [headrev.name] (" - 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 [headrev.current.real_name]" - else - text += "body destroyed" - text += ")" - - for(var/datum/objective/mutiny/objective in headrev.objectives) - targets |= objective.target + text += printplayer(headrev, 1) text += "
" - world << text if(revolutionaries.len || istype(ticker.mode,/datum/game_mode/revolution)) var/text = "
The revolutionaries were:" - for(var/datum/mind/rev in revolutionaries) - text += "
[rev.key] was [rev.name] (" - 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 [rev.current.real_name]" - else - text += "body destroyed" - text += ")" + text += printplayer(rev, 1) text += "
" - world << text - if( head_revolutionaries.len || revolutionaries.len || istype(ticker.mode,/datum/game_mode/revolution) ) var/text = "
The heads of staff were:" - var/list/heads = get_all_heads() for(var/datum/mind/head in heads) var/target = (head in targets) if(target) - text += "" - text += "
[head.key] was [head.name] (" - 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 [head.current.real_name]" - else - text += "body destroyed" - text += ")" - if(target) - text += "
" + text += "Target" + text += printplayer(head, 1) text += "
" - world << text diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm index acb36b6e0be..eb9da3b2762 100644 --- a/code/game/gamemodes/shadowling/shadowling.dm +++ b/code/game/gamemodes/shadowling/shadowling.dm @@ -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 << "The shadowlings have ascended and taken over the station!" + world << "The shadowlings have ascended and taken over the station!" else if(shadowling_dead && !check_shadow_victory()) //If the shadowlings have ascended, they can not lose the round - world << "The shadowlings have been killed by the crew!" + world << "The shadowlings have been killed by the crew!" else if(!check_shadow_victory() && SSshuttle.emergency.mode >= SHUTTLE_ESCAPE) - world << "The crew escaped the station before the shadowlings could ascend!" + world << "The crew escaped the station before the shadowlings could ascend!" else - world << "The shadowlings have failed!" + world << "The shadowlings have failed!" ..() return 1 @@ -232,7 +232,7 @@ Made by Xhuis id = "shadowling" say_mod = "chitters" specflags = list(NOBREATH,NOBLOOD,RADIMMUNE,NOGUNS) //Can't use guns due to muzzle flash - burnmod = 1.5 //1.5x burn damage, 2x is excessive + burnmod = 1.5 //1.5x burn damage, 2x is excessive heatmod = 1.5 /datum/species/shadow/ling/spec_life(mob/living/carbon/human/H) diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index 800beb52069..9417f0fd6ed 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -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;} From ed93cde3bdd6cc38d7bae39e9aa2fa72f937ac26 Mon Sep 17 00:00:00 2001 From: bgobandit Date: Mon, 31 Aug 2015 09:23:17 -0400 Subject: [PATCH 14/22] Cleanbots, floorbots and MULEbots are no longer audible by deaf people. --- code/game/machinery/bots/cleanbot.dm | 4 ++-- code/game/machinery/bots/floorbot.dm | 4 ++-- code/game/machinery/bots/mulebot.dm | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/code/game/machinery/bots/cleanbot.dm b/code/game/machinery/bots/cleanbot.dm index ea5613108f7..2cc3150b0ef 100644 --- a/code/game/machinery/bots/cleanbot.dm +++ b/code/game/machinery/bots/cleanbot.dm @@ -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("[on ? "On" : "Off"]")) 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/) diff --git a/code/game/machinery/bots/floorbot.dm b/code/game/machinery/bots/floorbot.dm index 75194d08fcd..1322d1c4bad 100644 --- a/code/game/machinery/bots/floorbot.dm +++ b/code/game/machinery/bots/floorbot.dm @@ -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("[src] makes an excited booping sound.") + audible_message("[src] makes an excited booping sound.") spawn(50) amount ++ anchored = 0 diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm index 8f69d506dc5..61c6e4fc0ef 100644 --- a/code/game/machinery/bots/mulebot.dm +++ b/code/game/machinery/bots/mulebot.dm @@ -420,13 +420,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.", "You hear an electronic buzzing sound.") + audible_message("[src] makes a sighing buzz.", "You hear an electronic buzzing sound.") playsound(loc, 'sound/machines/buzz-sigh.ogg', 50, 0) if(ANNOYED) - visible_message("[src] makes an annoyed buzzing sound.", "You hear an electronic buzzing sound.") + audible_message("[src] makes an annoyed buzzing sound.", "You hear an electronic buzzing sound.") playsound(loc, 'sound/machines/buzz-two.ogg', 50, 0) if(DELIGHT) - visible_message("[src] makes a delighted ping!", "You hear a ping.") + audible_message("[src] makes a delighted ping!", "You hear a ping.") playsound(loc, 'sound/machines/ping.ogg', 50, 0) @@ -719,7 +719,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!", "You hear a chime.") + audible_message("[src] makes a chiming sound!", "You hear a chime.") playsound(loc, 'sound/machines/chime.ogg', 50, 0) reached_target = 1 From 4644e99aa7f227f5fba4a63e02004d7e92a5cff3 Mon Sep 17 00:00:00 2001 From: xxalpha Date: Sun, 30 Aug 2015 12:06:36 +0100 Subject: [PATCH 15/22] Changed bloodcrawl to be a spell. Changed blood crawl to be a spell. BLOOOOD --- code/datums/spell.dm | 2 +- code/datums/spells/bloodcrawl.dm | 32 ++++ code/modules/mob/living/bloodcrawl.dm | 144 +++++++----------- .../simple_animal/slaughter/slaughter.dm | 9 +- .../simple_animal/slaughter/slaughterevent.dm | 3 + html/changelogs/xxalpha-crawlinginmyskin.yml | 7 + icons/mob/actions.dmi | Bin 40327 -> 42856 bytes tgstation.dme | 1 + 8 files changed, 107 insertions(+), 91 deletions(-) create mode 100644 code/datums/spells/bloodcrawl.dm create mode 100644 html/changelogs/xxalpha-crawlinginmyskin.yml diff --git a/code/datums/spell.dm b/code/datums/spell.dm index 2d514504c81..ef414e9269c 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -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' diff --git a/code/datums/spells/bloodcrawl.dm b/code/datums/spells/bloodcrawl.dm new file mode 100644 index 00000000000..0e5db631223 --- /dev/null +++ b/code/datums/spells/bloodcrawl.dm @@ -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 << "You need blood to blood crawl." + +/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 << "You cannot blood crawl." \ No newline at end of file diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm index a58fd4401a4..3f7bfba90cf 100644 --- a/code/modules/mob/living/bloodcrawl.dm +++ b/code/modules/mob/living/bloodcrawl.dm @@ -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("The [src] drags [victim] into the pool of blood!") - kidnapped = victim - src.loc = holder - src.holder = holder - if(kidnapped) - src << "You begin to feast on [kidnapped]. You can not move while you are doing this." - 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 << "You devour [kidnapped]. Your health is fully restored." - src.adjustBruteLoss(-1000) - src.adjustFireLoss(-1000) - src.adjustOxyLoss(-1000) - src.adjustToxLoss(-1000) - kidnapped.ghostize() - qdel(kidnapped) - else - src << "You happily devour...nothing? Your meal vanished at some point!" - src.notransform = 0 - -/mob/living/proc/phasein(obj/effect/decal/cleanable/B) - if(src.notransform) - src << "Finish eating first!" - else - src.loc = B.loc - src.client.eye = src - src.visible_message("The [src] rises out of the pool of blood!") - 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("The [src] drags [victim] into the pool of blood!") + kidnapped = victim + src.loc = holder + src.holder = holder + if(kidnapped) + src << "You begin to feast on [kidnapped]. You can not move while you are doing this." + 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 << "You devour [kidnapped]. Your health is fully restored." + src.adjustBruteLoss(-1000) + src.adjustFireLoss(-1000) + src.adjustOxyLoss(-1000) + src.adjustToxLoss(-1000) + kidnapped.ghostize() + qdel(kidnapped) + else + src << "You happily devour...nothing? Your meal vanished at some point!" + src.notransform = 0 + +/mob/living/proc/phasein(obj/effect/decal/cleanable/B) + if(src.notransform) + src << "Finish eating first!" + return 0 + + src.loc = B.loc + src.client.eye = src + src.visible_message("The [src] rises out of the pool of blood!") + playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1) + qdel(src.holder) + src.holder = null + return 1 \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/slaughter/slaughter.dm b/code/modules/mob/living/simple_animal/slaughter/slaughter.dm index ff0c9866215..5b4d228973d 100644 --- a/code/modules/mob/living/simple_animal/slaughter/slaughter.dm +++ b/code/modules/mob/living/simple_animal/slaughter/slaughter.dm @@ -54,7 +54,7 @@ /mob/living/simple_animal/slaughter/phasein() - ..() + . = ..() speed = 0 boost = world.time + 30 @@ -70,7 +70,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 <<"You already know how to blood crawl." + 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) diff --git a/code/modules/mob/living/simple_animal/slaughter/slaughterevent.dm b/code/modules/mob/living/simple_animal/slaughter/slaughterevent.dm index de3e477ab6d..167dd6b9683 100644 --- a/code/modules/mob/living/simple_animal/slaughter/slaughterevent.dm +++ b/code/modules/mob/living/simple_animal/slaughter/slaughterevent.dm @@ -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 << "You are currently not currently in the same plane of existence as the station. Ctrl+Click a blood pool to manifest." diff --git a/html/changelogs/xxalpha-crawlinginmyskin.yml b/html/changelogs/xxalpha-crawlinginmyskin.yml new file mode 100644 index 00000000000..04de682d000 --- /dev/null +++ b/html/changelogs/xxalpha-crawlinginmyskin.yml @@ -0,0 +1,7 @@ +author: xxalpha + +delete-after: True + +changes: + - tweak: "Blood crawling is now a spell." + diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi index 7419670c30b7f339ac241d04bd12feca7fee72e3..04604530a6b9eb5b0cea37514143f710d85ba74e 100644 GIT binary patch delta 22847 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

oon@5b;dee#OY&okCiPSDkm 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 delta 20298 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 V{4>%9!utRK002ovPDHLkV1kF~%+CM- diff --git a/tgstation.dme b/tgstation.dme index e89d43409bb..b661e8ecf55 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -224,6 +224,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" From 1e075da4ddff13d0619ff864f0bbfdd3d091381a Mon Sep 17 00:00:00 2001 From: Kyle Spier-Swenson Date: Mon, 31 Aug 2015 15:31:52 -0700 Subject: [PATCH 16/22] Adds logging of admins who use client side debugging tools to restart the server --- code/world.dm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/world.dm b/code/world.dm index b1d09abdd98..0073724214b 100644 --- a/code/world.dm +++ b/code/world.dm @@ -129,8 +129,12 @@ C << "PR: [input["announce"]]" #undef CHAT_PULLR +#define R_SERVER 16 /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 << "Rebooting World immediately due to host request" return ..(1) var/delay @@ -169,7 +173,7 @@ C << link("byond://[config.server]") ..(0) - +#undef R_SERVER /world/proc/load_mode() var/list/Lines = file2list("data/mode.txt") if(Lines.len) From f01e5a0275288179ef4237ae5659b0db4a1690ff Mon Sep 17 00:00:00 2001 From: Kyle Spier-Swenson Date: Mon, 31 Aug 2015 15:32:13 -0700 Subject: [PATCH 17/22] Update world.dm --- code/world.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/world.dm b/code/world.dm index 0073724214b..66c089edf5d 100644 --- a/code/world.dm +++ b/code/world.dm @@ -129,7 +129,6 @@ C << "PR: [input["announce"]]" #undef CHAT_PULLR -#define R_SERVER 16 /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) @@ -173,7 +172,6 @@ C << link("byond://[config.server]") ..(0) -#undef R_SERVER /world/proc/load_mode() var/list/Lines = file2list("data/mode.txt") if(Lines.len) From d0701c40884d73517f0234dedbf7ffea92875e58 Mon Sep 17 00:00:00 2001 From: xxalpha Date: Mon, 31 Aug 2015 15:49:26 +0100 Subject: [PATCH 18/22] Tweaked foam spread logic, foam layer. Better Changelog PERFORMANCE get_turf(loc) is still superior --- .../objects/effects/effect_system/effects_foam.dm | 12 +++--------- html/changelogs/xxalpha-PLmD_69pXpk.yml | 7 +++++++ 2 files changed, 10 insertions(+), 9 deletions(-) create mode 100644 html/changelogs/xxalpha-PLmD_69pXpk.yml diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index a3a305541c7..b9cb14220b8 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -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 diff --git a/html/changelogs/xxalpha-PLmD_69pXpk.yml b/html/changelogs/xxalpha-PLmD_69pXpk.yml new file mode 100644 index 00000000000..0d6252a37aa --- /dev/null +++ b/html/changelogs/xxalpha-PLmD_69pXpk.yml @@ -0,0 +1,7 @@ +author: xxalpha + +delete-after: True + +changes: + - tweak: "Changed foam spreading to be like gas spreading." + From 051cb02e7284bde3528cecc09d991fca421e37c8 Mon Sep 17 00:00:00 2001 From: xxalpha Date: Tue, 1 Sep 2015 15:40:41 +0100 Subject: [PATCH 19/22] Fixed dmi --- icons/mob/actions.dmi | Bin 40932 -> 43443 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi index 485d89155bc1a0e11051e607c1c96bdb7f8b21ce..23f5e04c7db0c33626725e65fe2ba4dec4fb7207 100644 GIT binary patch delta 23438 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

B`N)froJ5OwT_p%G(K>R+d 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 delta 20908 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 Date: Tue, 1 Sep 2015 16:07:24 +0000 Subject: [PATCH 20/22] Automatic changelog compile --- html/changelog.html | 24 ++++++++++++ html/changelogs/.all_changelog.yml | 25 ++++++++++++ .../ExcessiveUseOfCobblestone-PR-11270.yml | 38 ------------------- html/changelogs/Oisin100-Trees.yml | 8 ---- html/changelogs/Xhuis-SU4.yml | 11 ------ html/changelogs/xxalpha-PLmD_69pXpk.yml | 7 ---- html/changelogs/xxalpha-crawlinginmyskin.yml | 7 ---- html/changelogs/xxalpha-magborg.yml | 6 --- 8 files changed, 49 insertions(+), 77 deletions(-) delete mode 100644 html/changelogs/ExcessiveUseOfCobblestone-PR-11270.yml delete mode 100644 html/changelogs/Oisin100-Trees.yml delete mode 100644 html/changelogs/Xhuis-SU4.yml delete mode 100644 html/changelogs/xxalpha-PLmD_69pXpk.yml delete mode 100644 html/changelogs/xxalpha-crawlinginmyskin.yml delete mode 100644 html/changelogs/xxalpha-magborg.yml diff --git a/html/changelog.html b/html/changelog.html index 9d3505103bd..d7eb6d20081 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -60,6 +60,12 @@
    • Changelings' Digital Camoflague ability now renders them totally invisible to the AI
    +

    ExcessiveUseOfCobblestone updated:

    +
      +
    • Added health analyzer to the autolathe.
    • +
    • Moved Cloning board to Medical Machinery section.
    • +
    • Moved Telesci stuff to Teleporter section.
    • +

    Fox P McCloud updated:

    • Adds the emitter board to to the circuit imprinter for R&D.
    • @@ -77,9 +83,27 @@
      • Edaggers actually work now and have been buffed to 18 brute and 2 TC.
      +

      Oisin100 updated:

      +
        +
      • Nanotransen discover ancient human knowledge confirming that trees produce Oxygen From Carbon Dioxide
      • +
      • Trees now require Oxygen to live. And will die in extreme temperatures
      • +

      Xhuis updated:

      • The arcade machines have been stocked with a xenomorph action figure that comes with realistic sounds!
      • +
      • Darksight now has its own icon.
      • +
      • Empowered thralls have been added. While obvious, they are more powerful and can resist dethralling while conscious. Only 5 can exist at one time.
      • +
      • Shadowlings can now change their night vision radius by using the action button their eyes (glasses) now provide.
      • +
      • Torches are dimmer, being as bright as flashlights, and no longer fit on belts.
      • +
      • Black Recuperation now has a 1 minute cooldown, down from 5. It can also be used to empower living thralls.
      • +
      • Guise can now be used outside of darkness and makes the user more invisible than before.
      • +
      • Enthrall now functions properly when a shadowling is not hatched, allowing them to enthrall up to 5 people before hatching.
      • +
      +

      xxalpha updated:

      +
        +
      • Blood crawling is now a spell.
      • +
      • Engineering cyborgs now have a constant magpulse.
      • +
      • Changed foam spreading to be like gas spreading.

      28 August 2015

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 92c5a4b53f4..c9b25860c5f 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -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. diff --git a/html/changelogs/ExcessiveUseOfCobblestone-PR-11270.yml b/html/changelogs/ExcessiveUseOfCobblestone-PR-11270.yml deleted file mode 100644 index 7ac9ac15acf..00000000000 --- a/html/changelogs/ExcessiveUseOfCobblestone-PR-11270.yml +++ /dev/null @@ -1,38 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# spellcheck (typo fixes) -# experiment -# tgs (TG-ported fixes?) -################################# - -# Your name. -author: ExcessiveUseOfCobblestone - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# 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." diff --git a/html/changelogs/Oisin100-Trees.yml b/html/changelogs/Oisin100-Trees.yml deleted file mode 100644 index 3ce8b121560..00000000000 --- a/html/changelogs/Oisin100-Trees.yml +++ /dev/null @@ -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" diff --git a/html/changelogs/Xhuis-SU4.yml b/html/changelogs/Xhuis-SU4.yml deleted file mode 100644 index c45a1d02253..00000000000 --- a/html/changelogs/Xhuis-SU4.yml +++ /dev/null @@ -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." \ No newline at end of file diff --git a/html/changelogs/xxalpha-PLmD_69pXpk.yml b/html/changelogs/xxalpha-PLmD_69pXpk.yml deleted file mode 100644 index 0d6252a37aa..00000000000 --- a/html/changelogs/xxalpha-PLmD_69pXpk.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: xxalpha - -delete-after: True - -changes: - - tweak: "Changed foam spreading to be like gas spreading." - diff --git a/html/changelogs/xxalpha-crawlinginmyskin.yml b/html/changelogs/xxalpha-crawlinginmyskin.yml deleted file mode 100644 index 04de682d000..00000000000 --- a/html/changelogs/xxalpha-crawlinginmyskin.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: xxalpha - -delete-after: True - -changes: - - tweak: "Blood crawling is now a spell." - diff --git a/html/changelogs/xxalpha-magborg.yml b/html/changelogs/xxalpha-magborg.yml deleted file mode 100644 index 40a10134e57..00000000000 --- a/html/changelogs/xxalpha-magborg.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: xxalpha - -delete-after: True - -changes: - - rscadd: "Engineering cyborgs now have a constant magpulse." From a3d311192f78c10c90db764c4deeb00bcc6038fb Mon Sep 17 00:00:00 2001 From: palpatine213 Date: Tue, 1 Sep 2015 19:54:28 -0700 Subject: [PATCH 21/22] Added a changelog --- .../Shadowlight213-camerabugunshittening.yml | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 html/changelogs/Shadowlight213-camerabugunshittening.yml diff --git a/html/changelogs/Shadowlight213-camerabugunshittening.yml b/html/changelogs/Shadowlight213-camerabugunshittening.yml new file mode 100644 index 00000000000..031c45c61fa --- /dev/null +++ b/html/changelogs/Shadowlight213-camerabugunshittening.yml @@ -0,0 +1,36 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# spellcheck (typo fixes) +# experiment +# tgs (TG-ported fixes?) +################################# + +# Your name. +author: Shadowlight213 + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# 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: "The syndicate have taken notice of the camera bug's woeful underuse, and have managed to combine all of its upgrades into one!" From bf69c85f718a7443d027b3cfa0c1a41690a1b891 Mon Sep 17 00:00:00 2001 From: Ergovisavi Date: Fri, 14 Aug 2015 20:40:30 -0700 Subject: [PATCH 22/22] Mobs on fire adjustments: -You heat up faster based on fire stacks -Reduced the amount of fire stacks you lose over time per tick -Increased the damage you take while on fire at the highest temperature point -Increased the amount of fire stacks you get from hotspots --- code/modules/mob/living/carbon/human/life.dm | 4 ++-- code/modules/mob/living/living_defense.dm | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index be552c4aedb..a6d1e8857b6 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -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() diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 9a332445538..1fdcbad8cbb 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -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()