Inheritance
A key part of DM, being an Object-Oriented language, is the idea of inheritance.
Let's say you have an type with the path /datum/foo. If you then define a subtype /datum/foo/bar, it will inherit properties from the first.
/datum/foo
var/foo_var = 5
/proc/main()
var/datum/foo/bar/my_subtype = new
world << my_subtype.foo_var // 5
You can also override properties of the parent:
/datum/foo
var/foo_var = 5
/datum/foo/bar
foo_var = 10
/proc/main()
var/datum/foo/bar/my_subtype = new
world << my_subtype.foo_var // 10
You can do this with procs as well:
/datum/foo/proc/xyzzy()
world << "parent"
/datum/foo/bar/xyzzy()
world << "child"
/proc/main()
var/datum/foo/bar/my_subtype = new
my_subtype.xyzzy() // "child"
Sometimes, you'll want to have some custom functionality, in addition to, the parent's functionality. This is expressed in other languages sometimes as super(). Instead, we use ..() in DM. This can be called at any point in the proc.
/datum/foo/proc/dream()
return "yond"
/datum/foo/bar/dream()
world << "Be" + ..()
/proc/main()
var/datum/foo/bar/my_subtype = new
my_subtype.dream() // "Beyond"