Exemplo n.º 1
0
def PlaceItem(*qwp_extra):
    qc.self.mdl = qc.self.model #  so it can be restored on respawn
    qc.self.flags = defs.FL_ITEM #  make extra wide
    qc.self.solid = defs.SOLID_TRIGGER
    qc.self.movetype = defs.MOVETYPE_TOSS
    qc.self.velocity = Vector(0, 0, 0)
    qc.self.origin %= Vector(None, None, qc.self.origin.z + 6)
    oldz = qc.self.origin.z
    if not qc.droptofloor():
        engine.dprint('Bonus item fell out of level at ')
        engine.dprint(str(qc.self.origin))
        engine.dprint('\012')
        qc.self.remove()
        return 
Exemplo n.º 2
0
def misc_explobox2(*qwp_extra):
    qc.self.solid = defs.SOLID_BBOX
    qc.self.movetype = defs.MOVETYPE_NONE
    engine.precache_model('maps/b_exbox2.bsp')
    qc.self.setmodel('maps/b_exbox2.bsp')
    qc.setsize(qc.self, Vector(0, 0, 0), Vector(32, 32, 32))
    engine.precache_sound('weapons/r_exp3.wav')
    qc.self.health = 20
    qc.self.th_die = barrel_explode
    qc.self.takedamage = defs.DAMAGE_AIM
    qc.self.origin %= Vector(None, None, qc.self.origin.z + 2)
    oldz = qc.self.origin.z
    qc.droptofloor()
    if oldz - qc.self.origin.z > 250:
        engine.dprint('item fell out of level at ')
        engine.dprint(str(qc.self.origin))
        engine.dprint('\012')
        qc.self.remove()
Exemplo n.º 3
0
def misc_explobox2(*qwp_extra):
    qc.self.solid = defs.SOLID_BBOX
    qc.self.movetype = defs.MOVETYPE_NONE
    engine.precache_model('maps/b_exbox2.bsp')
    qc.self.setmodel('maps/b_exbox2.bsp')
    qc.setsize(qc.self, Vector(0, 0, 0), Vector(32, 32, 32))
    engine.precache_sound('weapons/r_exp3.wav')
    qc.self.health = 20
    qc.self.th_die = barrel_explode
    qc.self.takedamage = defs.DAMAGE_AIM
    qc.self.origin %= Vector(None, None, qc.self.origin.z + 2)
    oldz = qc.self.origin.z
    qc.droptofloor()
    if oldz - qc.self.origin.z > 250:
        engine.dprint('item fell out of level at ')
        engine.dprint(str(qc.self.origin))
        engine.dprint('\012')
        qc.self.remove()
Exemplo n.º 4
0
def place_flag(*qwp_extra):
    qc.self.mdl = qc.self.model  #  so it can be restored on respawn
    qc.self.flags = defs.FL_ITEM  #  make extra wide
    qc.self.solid = defs.SOLID_TRIGGER
    qc.self.movetype = defs.MOVETYPE_TOSS
    qc.self.velocity = Vector(0, 0, 0)
    qc.self.origin %= Vector(None, None, qc.self.origin.z + 6)
    qc.self.think = TeamCaptureFlagThink
    qc.self.touch = TeamCaptureFlagTouch
    qc.self.nextthink = qc.time + 0.1
    qc.self.cnt = FLAG_AT_BASE
    qc.self.mangle = qc.self.angles
    qc.self.effects |= defs.EF_DIMLIGHT
    if not qc.droptofloor():
        engine.dprint("Flag fell out of level at ")
        engine.dprint(str(qc.self.origin))
        engine.dprint("\012")
        qc.self.remove()
        return

    qc.self.oldorigin = qc.self.origin  #  save for flag return
Exemplo n.º 5
0
def place_flag(*qwp_extra):
    qc.self.mdl = qc.self.model  #  so it can be restored on respawn
    qc.self.flags = defs.FL_ITEM  #  make extra wide
    qc.self.solid = defs.SOLID_TRIGGER
    qc.self.movetype = defs.MOVETYPE_TOSS
    qc.self.velocity = Vector(0, 0, 0)
    qc.self.origin %= Vector(None, None, qc.self.origin.z + 6)
    qc.self.think = TeamCaptureFlagThink
    qc.self.touch = TeamCaptureFlagTouch
    qc.self.nextthink = qc.time + 0.1
    qc.self.cnt = FLAG_AT_BASE
    qc.self.mangle = qc.self.angles
    qc.self.effects |= defs.EF_DIMLIGHT
    if not qc.droptofloor():
        engine.dprint('Flag fell out of level at ')
        engine.dprint(str(qc.self.origin))
        engine.dprint('\012')
        qc.self.remove()
        return

    qc.self.oldorigin = qc.self.origin  #  save for flag return
Exemplo n.º 6
0
def noclass(*qwp_extra):
    engine.dprint('noclass spawned at')
    engine.dprint(str(qc.self.origin))
    engine.dprint('\012')
    qc.self.remove()
Exemplo n.º 7
0
def main(*qwp_extra):
    engine.dprint('main function\012')
    #  these are just commands the the prog compiler to copy these files
    qc.precache_file('progs.dat')
    qc.precache_file('gfx.wad')
    qc.precache_file('quake.rc')
    qc.precache_file('default.cfg')
    qc.precache_file('end1.bin')
    qc.precache_file('end2.bin')
    qc.precache_file('demo1.dem')
    qc.precache_file('demo2.dem')
    qc.precache_file('demo3.dem')
    # 
    #  these are all of the lumps from the cached.ls files
    # 
    qc.precache_file('gfx/palette.lmp')
    qc.precache_file('gfx/colormap.lmp')
    qc.precache_file('gfx/pop.lmp')
    qc.precache_file('gfx/complete.lmp')
    qc.precache_file('gfx/inter.lmp')
    qc.precache_file('gfx/ranking.lmp')
    qc.precache_file('gfx/vidmodes.lmp')
    qc.precache_file('gfx/finale.lmp')
    qc.precache_file('gfx/conback.lmp')
    qc.precache_file('gfx/qplaque.lmp')
    qc.precache_file('gfx/menudot1.lmp')
    qc.precache_file('gfx/menudot2.lmp')
    qc.precache_file('gfx/menudot3.lmp')
    qc.precache_file('gfx/menudot4.lmp')
    qc.precache_file('gfx/menudot5.lmp')
    qc.precache_file('gfx/menudot6.lmp')
    qc.precache_file('gfx/menuplyr.lmp')
    qc.precache_file('gfx/bigbox.lmp')
    qc.precache_file('gfx/dim_modm.lmp')
    qc.precache_file('gfx/dim_drct.lmp')
    qc.precache_file('gfx/dim_ipx.lmp')
    qc.precache_file('gfx/dim_tcp.lmp')
    qc.precache_file('gfx/dim_mult.lmp')
    qc.precache_file('gfx/mainmenu.lmp')
    qc.precache_file('gfx/box_tl.lmp')
    qc.precache_file('gfx/box_tm.lmp')
    qc.precache_file('gfx/box_tr.lmp')
    qc.precache_file('gfx/box_ml.lmp')
    qc.precache_file('gfx/box_mm.lmp')
    qc.precache_file('gfx/box_mm2.lmp')
    qc.precache_file('gfx/box_mr.lmp')
    qc.precache_file('gfx/box_bl.lmp')
    qc.precache_file('gfx/box_bm.lmp')
    qc.precache_file('gfx/box_br.lmp')
    qc.precache_file('gfx/sp_menu.lmp')
    qc.precache_file('gfx/ttl_sgl.lmp')
    qc.precache_file('gfx/ttl_main.lmp')
    qc.precache_file('gfx/ttl_cstm.lmp')
    qc.precache_file('gfx/mp_menu.lmp')
    qc.precache_file('gfx/netmen1.lmp')
    qc.precache_file('gfx/netmen2.lmp')
    qc.precache_file('gfx/netmen3.lmp')
    qc.precache_file('gfx/netmen4.lmp')
    qc.precache_file('gfx/netmen5.lmp')
    qc.precache_file('gfx/sell.lmp')
    qc.precache_file('gfx/help0.lmp')
    qc.precache_file('gfx/help1.lmp')
    qc.precache_file('gfx/help2.lmp')
    qc.precache_file('gfx/help3.lmp')
    qc.precache_file('gfx/help4.lmp')
    qc.precache_file('gfx/help5.lmp')
    qc.precache_file('gfx/pause.lmp')
    qc.precache_file('gfx/loading.lmp')
    qc.precache_file('gfx/p_option.lmp')
    qc.precache_file('gfx/p_load.lmp')
    qc.precache_file('gfx/p_save.lmp')
    qc.precache_file('gfx/p_multi.lmp')
    #  sounds loaded by C code
    engine.precache_sound('misc/menu1.wav')
    engine.precache_sound('misc/menu2.wav')
    engine.precache_sound('misc/menu3.wav')
    engine.precache_sound('ambience/water1.wav')
    engine.precache_sound('ambience/wind2.wav')
    #  shareware
    qc.precache_file('maps/start.bsp')
    qc.precache_file('maps/e1m1.bsp')
    qc.precache_file('maps/e1m2.bsp')
    qc.precache_file('maps/e1m3.bsp')
    qc.precache_file('maps/e1m4.bsp')
    qc.precache_file('maps/e1m5.bsp')
    qc.precache_file('maps/e1m6.bsp')
    qc.precache_file('maps/e1m7.bsp')
    qc.precache_file('maps/e1m8.bsp')
    #  registered
    qc.precache_file('gfx/pop.lmp')
    qc.precache_file('maps/e2m1.bsp')
    qc.precache_file('maps/e2m2.bsp')
    qc.precache_file('maps/e2m3.bsp')
    qc.precache_file('maps/e2m4.bsp')
    qc.precache_file('maps/e2m5.bsp')
    qc.precache_file('maps/e2m6.bsp')
    qc.precache_file('maps/e2m7.bsp')
    qc.precache_file('maps/e3m1.bsp')
    qc.precache_file('maps/e3m2.bsp')
    qc.precache_file('maps/e3m3.bsp')
    qc.precache_file('maps/e3m4.bsp')
    qc.precache_file('maps/e3m5.bsp')
    qc.precache_file('maps/e3m6.bsp')
    qc.precache_file('maps/e3m7.bsp')
    qc.precache_file('maps/e4m1.bsp')
    qc.precache_file('maps/e4m2.bsp')
    qc.precache_file('maps/e4m3.bsp')
    qc.precache_file('maps/e4m4.bsp')
    qc.precache_file('maps/e4m5.bsp')
    qc.precache_file('maps/e4m6.bsp')
    qc.precache_file('maps/e4m7.bsp')
    qc.precache_file('maps/e4m8.bsp')
    qc.precache_file('maps/end.bsp')
    qc.precache_file('maps/dm1.bsp')
    qc.precache_file('maps/dm2.bsp')
    qc.precache_file('maps/dm3.bsp')
    qc.precache_file('maps/dm4.bsp')
    qc.precache_file('maps/dm5.bsp')
    qc.precache_file('maps/dm6.bsp')
Exemplo n.º 8
0
def main(*qwp_extra):
    engine.dprint('main function\012')
    #  these are just commands the the prog compiler to copy these files
    qc.precache_file('progs.dat')
    qc.precache_file('gfx.wad')
    qc.precache_file('quake.rc')
    qc.precache_file('default.cfg')
    qc.precache_file('end1.bin')
    qc.precache_file('end2.bin')
    qc.precache_file('demo1.dem')
    qc.precache_file('demo2.dem')
    qc.precache_file('demo3.dem')
    #
    #  these are all of the lumps from the cached.ls files
    #
    qc.precache_file('gfx/palette.lmp')
    qc.precache_file('gfx/colormap.lmp')
    qc.precache_file('gfx/pop.lmp')
    qc.precache_file('gfx/complete.lmp')
    qc.precache_file('gfx/inter.lmp')
    qc.precache_file('gfx/ranking.lmp')
    qc.precache_file('gfx/vidmodes.lmp')
    qc.precache_file('gfx/finale.lmp')
    qc.precache_file('gfx/conback.lmp')
    qc.precache_file('gfx/qplaque.lmp')
    qc.precache_file('gfx/menudot1.lmp')
    qc.precache_file('gfx/menudot2.lmp')
    qc.precache_file('gfx/menudot3.lmp')
    qc.precache_file('gfx/menudot4.lmp')
    qc.precache_file('gfx/menudot5.lmp')
    qc.precache_file('gfx/menudot6.lmp')
    qc.precache_file('gfx/menuplyr.lmp')
    qc.precache_file('gfx/bigbox.lmp')
    qc.precache_file('gfx/dim_modm.lmp')
    qc.precache_file('gfx/dim_drct.lmp')
    qc.precache_file('gfx/dim_ipx.lmp')
    qc.precache_file('gfx/dim_tcp.lmp')
    qc.precache_file('gfx/dim_mult.lmp')
    qc.precache_file('gfx/mainmenu.lmp')
    qc.precache_file('gfx/box_tl.lmp')
    qc.precache_file('gfx/box_tm.lmp')
    qc.precache_file('gfx/box_tr.lmp')
    qc.precache_file('gfx/box_ml.lmp')
    qc.precache_file('gfx/box_mm.lmp')
    qc.precache_file('gfx/box_mm2.lmp')
    qc.precache_file('gfx/box_mr.lmp')
    qc.precache_file('gfx/box_bl.lmp')
    qc.precache_file('gfx/box_bm.lmp')
    qc.precache_file('gfx/box_br.lmp')
    qc.precache_file('gfx/sp_menu.lmp')
    qc.precache_file('gfx/ttl_sgl.lmp')
    qc.precache_file('gfx/ttl_main.lmp')
    qc.precache_file('gfx/ttl_cstm.lmp')
    qc.precache_file('gfx/mp_menu.lmp')
    qc.precache_file('gfx/netmen1.lmp')
    qc.precache_file('gfx/netmen2.lmp')
    qc.precache_file('gfx/netmen3.lmp')
    qc.precache_file('gfx/netmen4.lmp')
    qc.precache_file('gfx/netmen5.lmp')
    qc.precache_file('gfx/sell.lmp')
    qc.precache_file('gfx/help0.lmp')
    qc.precache_file('gfx/help1.lmp')
    qc.precache_file('gfx/help2.lmp')
    qc.precache_file('gfx/help3.lmp')
    qc.precache_file('gfx/help4.lmp')
    qc.precache_file('gfx/help5.lmp')
    qc.precache_file('gfx/pause.lmp')
    qc.precache_file('gfx/loading.lmp')
    qc.precache_file('gfx/p_option.lmp')
    qc.precache_file('gfx/p_load.lmp')
    qc.precache_file('gfx/p_save.lmp')
    qc.precache_file('gfx/p_multi.lmp')
    #  sounds loaded by C code
    engine.precache_sound('misc/menu1.wav')
    engine.precache_sound('misc/menu2.wav')
    engine.precache_sound('misc/menu3.wav')
    engine.precache_sound('ambience/water1.wav')
    engine.precache_sound('ambience/wind2.wav')
    #  shareware
    qc.precache_file('maps/start.bsp')
    qc.precache_file('maps/e1m1.bsp')
    qc.precache_file('maps/e1m2.bsp')
    qc.precache_file('maps/e1m3.bsp')
    qc.precache_file('maps/e1m4.bsp')
    qc.precache_file('maps/e1m5.bsp')
    qc.precache_file('maps/e1m6.bsp')
    qc.precache_file('maps/e1m7.bsp')
    qc.precache_file('maps/e1m8.bsp')
    #  registered
    qc.precache_file('gfx/pop.lmp')
    qc.precache_file('maps/e2m1.bsp')
    qc.precache_file('maps/e2m2.bsp')
    qc.precache_file('maps/e2m3.bsp')
    qc.precache_file('maps/e2m4.bsp')
    qc.precache_file('maps/e2m5.bsp')
    qc.precache_file('maps/e2m6.bsp')
    qc.precache_file('maps/e2m7.bsp')
    qc.precache_file('maps/e3m1.bsp')
    qc.precache_file('maps/e3m2.bsp')
    qc.precache_file('maps/e3m3.bsp')
    qc.precache_file('maps/e3m4.bsp')
    qc.precache_file('maps/e3m5.bsp')
    qc.precache_file('maps/e3m6.bsp')
    qc.precache_file('maps/e3m7.bsp')
    qc.precache_file('maps/e4m1.bsp')
    qc.precache_file('maps/e4m2.bsp')
    qc.precache_file('maps/e4m3.bsp')
    qc.precache_file('maps/e4m4.bsp')
    qc.precache_file('maps/e4m5.bsp')
    qc.precache_file('maps/e4m6.bsp')
    qc.precache_file('maps/e4m7.bsp')
    qc.precache_file('maps/e4m8.bsp')
    qc.precache_file('maps/end.bsp')
    qc.precache_file('maps/dm1.bsp')
    qc.precache_file('maps/dm2.bsp')
    qc.precache_file('maps/dm3.bsp')
    qc.precache_file('maps/dm4.bsp')
    qc.precache_file('maps/dm5.bsp')
    qc.precache_file('maps/dm6.bsp')
Exemplo n.º 9
0
def noclass(*qwp_extra):
    engine.dprint('noclass spawned at')
    engine.dprint(str(qc.self.origin))
    engine.dprint('\012')
    qc.self.remove()
Exemplo n.º 10
0
def func_door(*qwp_extra):
    if qc.world.worldtype == 0:
        engine.precache_sound('doors/medtry.wav')
        engine.precache_sound('doors/meduse.wav')
        qc.self.noise3 = 'doors/medtry.wav'
        qc.self.noise4 = 'doors/meduse.wav'        
    elif qc.world.worldtype == 1:
        engine.precache_sound('doors/runetry.wav')
        engine.precache_sound('doors/runeuse.wav')
        qc.self.noise3 = 'doors/runetry.wav'
        qc.self.noise4 = 'doors/runeuse.wav'        
    elif qc.world.worldtype == 2:
        engine.precache_sound('doors/basetry.wav')
        engine.precache_sound('doors/baseuse.wav')
        qc.self.noise3 = 'doors/basetry.wav'
        qc.self.noise4 = 'doors/baseuse.wav'        
    else:
        engine.dprint('no worldtype set!\012')
        
    if qc.self.sounds == 0:
        engine.precache_sound('misc/null.wav')
        engine.precache_sound('misc/null.wav')
        qc.self.noise1 = 'misc/null.wav'
        qc.self.noise2 = 'misc/null.wav'
        
    if qc.self.sounds == 1:
        engine.precache_sound('doors/drclos4.wav')
        engine.precache_sound('doors/doormv1.wav')
        qc.self.noise1 = 'doors/drclos4.wav'
        qc.self.noise2 = 'doors/doormv1.wav'
        
    if qc.self.sounds == 2:
        engine.precache_sound('doors/hydro1.wav')
        engine.precache_sound('doors/hydro2.wav')
        qc.self.noise2 = 'doors/hydro1.wav'
        qc.self.noise1 = 'doors/hydro2.wav'
        
    if qc.self.sounds == 3:
        engine.precache_sound('doors/stndr1.wav')
        engine.precache_sound('doors/stndr2.wav')
        qc.self.noise2 = 'doors/stndr1.wav'
        qc.self.noise1 = 'doors/stndr2.wav'
        
    if qc.self.sounds == 4:
        engine.precache_sound('doors/ddoor1.wav')
        engine.precache_sound('doors/ddoor2.wav')
        qc.self.noise1 = 'doors/ddoor2.wav'
        qc.self.noise2 = 'doors/ddoor1.wav'
        
    subs.SetMovedir()
    qc.self.max_health = qc.self.health
    qc.self.solid = defs.SOLID_BSP
    qc.self.movetype = defs.MOVETYPE_PUSH
    qc.setorigin(qc.self, qc.self.origin)
    qc.self.setmodel(qc.self.model)
    qc.self.classname = 'door'
    qc.self.blocked = door_blocked
    qc.self.use = door_use
    if qc.self.spawnflags & DOOR_SILVER_KEY:
        qc.self.items = defs.IT_KEY1
    if qc.self.spawnflags & DOOR_GOLD_KEY:
        qc.self.items = defs.IT_KEY2
    if not qc.self.speed:
        qc.self.speed = 100
    if not qc.self.wait:
        qc.self.wait = 3
    if not qc.self.lip:
        qc.self.lip = 8
    if not qc.self.dmg:
        qc.self.dmg = 2
    qc.self.pos1 = qc.self.origin
    qc.self.pos2 = qc.self.pos1 + qc.self.movedir * (math.fabs(qc.self.movedir * qc.self.size) - qc.self.lip)
    #  DOOR_START_OPEN is to allow an entity to be lighted in the closed position
    #  but spawn in the open position
    if qc.self.spawnflags & DOOR_START_OPEN:
        qc.setorigin(qc.self, qc.self.pos2)
        qc.self.pos2 = qc.self.pos1
        qc.self.pos1 = qc.self.origin
        
    qc.self.state = defs.STATE_BOTTOM
    if qc.self.health:
        qc.self.takedamage = defs.DAMAGE_YES
        qc.self.th_die = door_killed
        
    if qc.self.items:
        qc.self.wait = -1
    qc.self.touch = door_touch
    #  LinkDoors can't be done until all of the doors have been spawned, so
    #  the sizes can be detected properly.
    qc.self.think = LinkDoors
    qc.self.nextthink = qc.self.ltime + 0.1
Exemplo n.º 11
0
def func_door(*qwp_extra):
    if qc.world.worldtype == 0:
        engine.precache_sound('doors/medtry.wav')
        engine.precache_sound('doors/meduse.wav')
        qc.self.noise3 = 'doors/medtry.wav'
        qc.self.noise4 = 'doors/meduse.wav'
    elif qc.world.worldtype == 1:
        engine.precache_sound('doors/runetry.wav')
        engine.precache_sound('doors/runeuse.wav')
        qc.self.noise3 = 'doors/runetry.wav'
        qc.self.noise4 = 'doors/runeuse.wav'
    elif qc.world.worldtype == 2:
        engine.precache_sound('doors/basetry.wav')
        engine.precache_sound('doors/baseuse.wav')
        qc.self.noise3 = 'doors/basetry.wav'
        qc.self.noise4 = 'doors/baseuse.wav'
    else:
        engine.dprint('no worldtype set!\012')

    if qc.self.sounds == 0:
        engine.precache_sound('misc/null.wav')
        engine.precache_sound('misc/null.wav')
        qc.self.noise1 = 'misc/null.wav'
        qc.self.noise2 = 'misc/null.wav'

    if qc.self.sounds == 1:
        engine.precache_sound('doors/drclos4.wav')
        engine.precache_sound('doors/doormv1.wav')
        qc.self.noise1 = 'doors/drclos4.wav'
        qc.self.noise2 = 'doors/doormv1.wav'

    if qc.self.sounds == 2:
        engine.precache_sound('doors/hydro1.wav')
        engine.precache_sound('doors/hydro2.wav')
        qc.self.noise2 = 'doors/hydro1.wav'
        qc.self.noise1 = 'doors/hydro2.wav'

    if qc.self.sounds == 3:
        engine.precache_sound('doors/stndr1.wav')
        engine.precache_sound('doors/stndr2.wav')
        qc.self.noise2 = 'doors/stndr1.wav'
        qc.self.noise1 = 'doors/stndr2.wav'

    if qc.self.sounds == 4:
        engine.precache_sound('doors/ddoor1.wav')
        engine.precache_sound('doors/ddoor2.wav')
        qc.self.noise1 = 'doors/ddoor2.wav'
        qc.self.noise2 = 'doors/ddoor1.wav'

    subs.SetMovedir()
    qc.self.max_health = qc.self.health
    qc.self.solid = defs.SOLID_BSP
    qc.self.movetype = defs.MOVETYPE_PUSH
    qc.setorigin(qc.self, qc.self.origin)
    qc.self.setmodel(qc.self.model)
    qc.self.classname = 'door'
    qc.self.blocked = door_blocked
    qc.self.use = door_use
    if qc.self.spawnflags & DOOR_SILVER_KEY:
        qc.self.items = defs.IT_KEY1
    if qc.self.spawnflags & DOOR_GOLD_KEY:
        qc.self.items = defs.IT_KEY2
    if not qc.self.speed:
        qc.self.speed = 100
    if not qc.self.wait:
        qc.self.wait = 3
    if not qc.self.lip:
        qc.self.lip = 8
    if not qc.self.dmg:
        qc.self.dmg = 2
    qc.self.pos1 = qc.self.origin
    qc.self.pos2 = qc.self.pos1 + qc.self.movedir * (
        math.fabs(qc.self.movedir * qc.self.size) - qc.self.lip)
    #  DOOR_START_OPEN is to allow an entity to be lighted in the closed position
    #  but spawn in the open position
    if qc.self.spawnflags & DOOR_START_OPEN:
        qc.setorigin(qc.self, qc.self.pos2)
        qc.self.pos2 = qc.self.pos1
        qc.self.pos1 = qc.self.origin

    qc.self.state = defs.STATE_BOTTOM
    if qc.self.health:
        qc.self.takedamage = defs.DAMAGE_YES
        qc.self.th_die = door_killed

    if qc.self.items:
        qc.self.wait = -1
    qc.self.touch = door_touch
    #  LinkDoors can't be done until all of the doors have been spawned, so
    #  the sizes can be detected properly.
    qc.self.think = LinkDoors
    qc.self.nextthink = qc.self.ltime + 0.1