예제 #1
0
def load_npcs(area, parea):
    area, w = game_utils.read_word(area, False)
    w = w[1:]  # strip the pound
    while w != "0":
        vnum = int(w)
        if vnum in instance.npc_templates:
            comm.notify("load_npcs: vnum {} duplicated.".format(vnum),
                        merc.CONSOLE_CRITICAL)
            sys.exit(1)

        npc = handler_npc.Npc()
        npc.vnum = vnum
        instance.npc_templates[npc.vnum] = npc
        npc.area = parea.name

        area, npc.name = game_utils.read_string(area)
        npc.name = npc.name.lower()
        area, npc.short_descr = game_utils.read_string(area)

        area, npc.long_descr = game_utils.read_string(area)
        npc.long_descr = miniboa.terminal.escape(npc.long_descr, "ANSI")
        area, npc.description = game_utils.read_string(area)
        npc.description = miniboa.terminal.escape(npc.description, "ANSI")

        area, act = game_utils.read_int(area)
        npc.act.bits = act | merc.ACT_IS_NPC
        area, affected_by = game_utils.read_int(area)
        npc.affected_by.bits = affected_by
        area, npc.alignment = game_utils.read_int(area)

        area, letter = game_utils.read_letter(area)
        area, level = game_utils.read_int(area)
        npc.level = game_utils.number_fuzzy(level)
        area, npc.hitroll = game_utils.read_int(area)
        area, npc.armor = game_utils.read_word(area)
        area, dummy = game_utils.read_int(area)
        area = game_utils.read_forward(area)
        area, dummy = game_utils.read_int(area)
        area = game_utils.read_forward(area)
        area, dummy = game_utils.read_int(area)
        area, dummy = game_utils.read_int(area)
        area = game_utils.read_forward(area)
        area, dummy = game_utils.read_int(area)
        area = game_utils.read_forward(area)
        area, dummy = game_utils.read_int(area)
        area, npc.gold = game_utils.read_int(area)
        area, dummy = game_utils.read_int(area)
        area, dummy = game_utils.read_int(area)
        area, dummy = game_utils.read_int(area)
        area, npc.sex = game_utils.read_int(area)

        area, w = game_utils.read_word(area, False)
        w = w[1:]  # strip the pound
    return area
예제 #2
0
def create_mobile(npc_template):
    if not npc_template:
        comm.notify("create_mobile: no npc_template", merc.CONSOLE_CRITICAL)
        sys.exit(1)

    npc = handler_npc.Npc(npc_template)
    npc.id = game_utils.get_mob_id(npc=True)
    npc.level = max(1, game_utils.number_fuzzy(npc_template.level))
    npc.armor = game_utils.interpolate(npc.level, 100, -100)

    if npc_template.spec_fun:
        npc.spec_fun = special.spec_table[npc_template.spec_fun]

    tempvalue = min(
        30000, npc.level * 8 + game_utils.number_range(
            npc.level * npc.level // 4, npc.level * npc.level))
    npc.max_hit = tempvalue
    npc.hit = npc.max_hit
    npc.hitroll = npc.level
    npc.damroll = npc.level

    # link the mob to the world list
    npc_template.count += 1
    return npc
예제 #3
0
def load_npcs(area, pArea):
    area, w = game_utils.read_word(area, False)
    w = w[1:]  # strip the pound

    while w != '0':
        npc = handler_npc.Npc()
        npc.vnum = int(w)
        instance.npc_templates[npc.vnum] = npc
        npc.area = pArea.name
        area, npc.name = game_utils.read_string(area)
        npc.name = npc.name.lower()
        area, npc.short_descr = game_utils.read_string(area)

        area, npc.long_descr = game_utils.read_string(area)
        npc.long_descr = miniboa.terminal.escape(npc.long_descr, 'pyom')
        area, npc.description = game_utils.read_string(area)
        npc.description = miniboa.terminal.escape(npc.description, 'pyom')

        area, npc.race = game_utils.read_string(area)
        area = npc.act.read_bits(area, default=merc.ACT_IS_NPC | npc.race.act)
        area = npc.affected_by.read_bits(area, default=npc.race.aff)
        area, npc.alignment = game_utils.read_int(area)
        area, npc.group = game_utils.read_int(area)
        area, npc.level = game_utils.read_int(area)
        area, npc.hitroll = game_utils.read_int(area)
        area, npc.hit_dice[0] = game_utils.read_int(area)
        area = game_utils.read_forward(area)
        area, npc.hit_dice[1] = game_utils.read_int(area)
        area = game_utils.read_forward(area)
        area, npc.hit_dice[2] = game_utils.read_int(area)
        area, npc.mana_dice[0] = game_utils.read_int(area)
        area = game_utils.read_forward(area)
        area, npc.mana_dice[1] = game_utils.read_int(area)
        area = game_utils.read_forward(area)
        area, npc.mana_dice[2] = game_utils.read_int(area)
        area, npc.dam_dice[0] = game_utils.read_int(area)
        area = game_utils.read_forward(area)
        area, npc.dam_dice[1] = game_utils.read_int(area)
        area = game_utils.read_forward(area)
        area, npc.dam_dice[2] = game_utils.read_int(area)
        area, npc.dam_type = game_utils.read_word(area, False)
        npc.dam_type = state_checks.name_lookup(const.attack_table,
                                                npc.dam_type)
        area, npc.armor[0] = game_utils.read_int(area)
        area, npc.armor[1] = game_utils.read_int(area)
        area, npc.armor[2] = game_utils.read_int(area)
        area, npc.armor[3] = game_utils.read_int(area)
        area = npc.off_flags.read_bits(area, default=npc.race.off)
        area = npc.imm_flags.read_bits(area, default=npc.race.imm)
        area = npc.res_flags.read_bits(area, default=npc.race.res)
        area = npc.vuln_flags.read_bits(area, default=npc.race.vuln)
        area, npc.start_pos = game_utils.read_word(area, False)
        area, npc.default_pos = game_utils.read_word(area, False)
        npc.start_pos = state_checks.name_lookup(tables.position_table,
                                                 npc.start_pos, 'short_name')
        npc.default_pos = state_checks.name_lookup(tables.position_table,
                                                   npc.default_pos,
                                                   'short_name')
        area, sex = game_utils.read_word(area, False)
        npc.sex = state_checks.value_lookup(tables.sex_table, sex)
        area, npc.wealth = game_utils.read_int(area)
        area = npc.form.read_bits(area, default=npc.race.form)
        area = npc.parts.read_bits(area, default=npc.race.parts)
        area, npc.size = game_utils.read_word(area, False)
        area, npc.material = game_utils.read_word(area, False)
        area, w = game_utils.read_word(area, False)
        npc.size = tables.size_table.index(npc.size)
        while w == 'F':
            area, word = game_utils.read_word(area, False)
            area, vector = game_utils.read_flags(area)
            area, w = game_utils.read_word(area, False)
        w = w[1:]  # strip the pound
    return area
예제 #4
0
def create_mobile(npc_template):
    if npc_template is None:
        logger.critical("Create_mobile: None pMobIndex.")
        sys.exit(1)

    npc = handler_npc.Npc(npc_template)
    npc.id = game_utils.get_mob_id()
    if npc_template.spec_fun:
        npc.spec_fun = special.spec_table[npc_template.spec_fun]
    npc.prompt = None

    if npc_template.wealth == 0:
        npc.silver = 0
        npc.gold = 0
    else:
        wealth = random.randint(npc_template.wealth // 2,
                                3 * npc_template.wealth // 2)
        npc.gold = random.randint(wealth // 200, wealth // 100)
        npc.silver = wealth - (npc.gold * 100)

    if npc_template.new_format:
        # load in new style */
        # read from prototype */
        #npc.group = npc_template.group
        #npc.act.bits = npc_template.act.bits
        npc.comm.set_bit(merc.COMM_NOCHANNELS | merc.COMM_NOSHOUT
                         | merc.COMM_NOTELL)
        #npc.affected_by.bits = npc_template.affected_by.bits
        #npc.alignment = npc_template.alignment
        #npc.level = npc_template.level
        #npc.hitroll = npc_template.hitroll
        #npc.damroll = npc_template.dam_dice[merc.DICE_BONUS]
        npc.max_hit = game_utils.dice(
            npc_template.hit_dice[merc.DICE_NUMBER], npc_template.hit_dice[
                merc.DICE_TYPE]) + npc_template.hit_dice[merc.DICE_BONUS]
        npc.hit = npc.max_hit
        npc.max_mana = game_utils.dice(
            npc_template.mana_dice[merc.DICE_NUMBER], npc_template.mana_dice[
                merc.DICE_TYPE]) + npc_template.mana_dice[merc.DICE_BONUS]
        npc.mana = npc.max_mana
        npc.damage[merc.DICE_NUMBER] = npc_template.dam_dice[merc.DICE_NUMBER]
        npc.damage[merc.DICE_TYPE] = npc_template.dam_dice[merc.DICE_TYPE]
        #npc.dam_type = npc_template.dam_type
        if npc.dam_type == 0:
            num = random.randint(1, 3)
            if num == 1:
                npc.dam_type = 3  # slash */
            elif num == 2:
                npc.dam_type = 7  # pound */
            elif num == 3:
                npc.dam_type = 11  # pierce */
        for i in range(4):
            npc.armor[i] = npc_template.armor[i]
        #npc.off_flags.bits = npc_template.off_flags.bits
        #npc.imm_flags.bits = npc_template.imm_flags.bits
        #npc.res_flags.bits = npc_template.res_flags.bits
        #npc.vuln_flags.bits = npc_template.vuln_flags.bits
        #npc.start_pos = npc_template.start_pos
        #npc.default_pos = npc_template.default_pos
        #npc.sex = npc_template.sex
        if type(npc_template.sex) != int or npc.sex == 3:  # random sex */
            npc.sex = random.randint(1, 2)
        #npc.race = npc_template.race
        #npc.form.bits = npc_template.form.bits
        #npc.parts.bits = npc_template.parts.bits
        #npc.size = int(npc_template.size)
        #npc.material = npc_template.material

        # computed on the spot */
        for i in range(merc.MAX_STATS):
            npc.perm_stat[i] = min(25, 11 + npc.level // 4)

        if npc.act.is_set(merc.ACT_WARRIOR):
            npc.perm_stat[merc.STAT_STR] += 3
            npc.perm_stat[merc.STAT_INT] -= 1
            npc.perm_stat[merc.STAT_CON] += 2

        if npc.act.is_set(merc.ACT_THIEF):
            npc.perm_stat[merc.STAT_DEX] += 3
            npc.perm_stat[merc.STAT_INT] += 1
            npc.perm_stat[merc.STAT_WIS] -= 1

        if npc.act.is_set(merc.ACT_CLERIC):
            npc.perm_stat[merc.STAT_WIS] += 3
            npc.perm_stat[merc.STAT_DEX] -= 1
            npc.perm_stat[merc.STAT_STR] += 1

        if npc.act.is_set(merc.ACT_MAGE):
            npc.perm_stat[merc.STAT_INT] += 3
            npc.perm_stat[merc.STAT_STR] -= 1
            npc.perm_stat[merc.STAT_DEX] += 1

        if npc.is_npc() and npc.off_flags.is_set(merc.OFF_FAST):
            npc.perm_stat[merc.STAT_DEX] += 2

        npc.perm_stat[merc.STAT_STR] += npc.size - merc.SIZE_MEDIUM
        npc.perm_stat[merc.STAT_CON] += (npc.size - merc.SIZE_MEDIUM) // 2
        af = handler_game.AFFECT_DATA()
        # let's get some spell action */
        if npc.is_affected(merc.AFF_SANCTUARY):
            af.where = merc.TO_AFFECTS
            af.type = "sanctuary"
            af.level = npc.level
            af.duration = -1
            af.location = merc.APPLY_NONE
            af.modifier = 0
            af.bitvector = merc.AFF_SANCTUARY
            npc.affect_add(af)

        if npc.is_affected(merc.AFF_HASTE):
            af.where = merc.TO_AFFECTS
            af.type = "haste"
            af.level = npc.level
            af.duration = -1
            af.location = merc.APPLY_DEX
            af.modifier = 1 + (npc.level >= 18) + (npc.level >=
                                                   25) + (npc.level >= 32)
            af.bitvector = merc.AFF_HASTE
            npc.affect_add(af)

        if npc.is_affected(merc.AFF_PROTECT_EVIL):
            af.where = merc.TO_AFFECTS
            af.type = "protection evil"
            af.level = npc.level
            af.duration = -1
            af.location = merc.APPLY_SAVES
            af.modifier = -1
            af.bitvector = merc.AFF_PROTECT_EVIL
            npc.affect_add(af)

        if npc.is_affected(merc.AFF_PROTECT_GOOD):
            af.where = merc.TO_AFFECTS
            af.type = "protection good"
            af.level = npc.level
            af.duration = -1
            af.location = merc.APPLY_SAVES
            af.modifier = -1
            af.bitvector = merc.AFF_PROTECT_GOOD
            npc.affect_add(af)
    else:  # read in old format and convert */
        #npc.act.bits = npc_template.act.bits
        #npc.affected_by.bits = npc_template.affected_by.bits
        #npc.alignment = npc_template.alignment
        #npc.level = npc_template.level
        #npc.hitroll = npc_template.hitroll
        npc.damroll = 0
        npc.max_hit = npc.level * 8 + random.randint(
            npc.level * npc.level // 4, npc.level * npc.level)
        npc.max_hit *= .9
        npc.hit = npc.max_hit
        npc.max_mana = 100 + game_utils.dice(npc.level, 10)
        npc.mana = npc.max_mana
        num = random.randint(1, 3)
        if num == 1:
            npc.dam_type = 3  # slash */
        elif num == 2:
            npc.dam_type = 7  # pound */
        elif num == 3:
            npc.dam_type = 11  # pierce */
        for i in range(3):
            npc.armor[i] = game_utils.interpolate(npc.level, 100, -100)
        npc.armor[3] = game_utils.interpolate(npc.level, 100, 0)
        #npc.race = npc_template.race
        #npc.off_flags.bits = npc_template.off_flags.bits
        #npc.imm_flags.bits = npc_template.imm_flags.bits
        #npc.res_flags.bits = npc_template.res_flags.bits
        #npc.vuln_flags.bits = npc_template.vuln_flags.bits
        #npc.start_pos = npc_template.start_pos
        #npc.default_pos = npc_template.default_pos
        #npc.sex = npc_template.sex
        #npc.form.bits = npc_template.form.bits
        #npc.parts.bits = npc_template.parts.bits
        npc.size = merc.SIZE_MEDIUM
        npc.material = ""

        for i in merc.MAX_STATS:
            npc.perm_stat[i] = 11 + npc.level // 4
    npc.position = npc.start_pos

    # link the mob to the world list */
    return npc