roguev6 > rogue.py


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

コアクラス。

どうしても子供のオブジェクトが、データオブジェクトになってしまって、支配的なコードになってしまう。

どうすればいいんだろな。これ。

ちなみに動きません!

from vect import Vector2d
from charcter import CharcterPool

class RogueCore:
  THINK_LIMIT = 4
  def __init__(self):
    self.obj_pool=ObjPool()
    self.map_pool=MapPool()
    self.start_point=(0,0)
    self.game_time=0#ゲーム内経過ターン
    self.show_range= Vector2d(10,10) #主人公が見ることができる可視域
  #Rogue内ターンを増加させる
  def append_term(self):
    target = self.obj_pool[self.term]
    #ターゲットがアクションを持っている
    if isinstance(target,Player) and not target.has_act():
      return ActData('System',ActData.INPUTWAIT)
    else:
      actdata = self.__think_checkfilter(target) 
      self.__addterm()
      return actdata

  #単純にターンを回す
  def __addterm(self):
    if self.term >= len(self.obj_pool)-1:
      self.term=0
    else:
      self.term+=1

  #アクションが有効かどうかを判定し有効であれば行動する
  def __think_checkfilter(self,target):
    current_map = self.map_pool[target.get_map()]
    act = target.think(self.obj_pool,current_map,0)
    if act.type==ActData.ATTACK:
      attack_point = act.direction + target.get_pos()
      attack_target = self.obj_pool.at(attack_point.dump())
      if attack_target:
        attack_target.damage(target)
        talklog(
            '%sは%sを%s'%( target.get_name(),
                           attack_target.get_name(),
                           '殴った'))
      else:
        talklog('%sは空を%s'%(target.get_name(),'殴った'))

    elif act.type==ActData.MOVE and self.__movable_to(target,act.direction):
      target.move(act.direction)
    else:
      act = ActData(target.get_name(),ActData.REST)
    return act

  #行動可能かのチェックを行う関数
  def __movable_to(self,charcter,direction):
    point = charcter.get_pos() + direction
    current_map = self.map_pool[charcter.get_map()]

    #オブジェクトプール内にすでにその位置にキャラクタがいる
    if self.obj_pool.at(point):
      return False
    #その中には入れるか?
    if current_map.has_entry(point):
      return True
    else:
      return False

  #行動せずにターンを飛ばす
  def rest(self):
    player = self.obj_pool.get_player()
    act_rest =  ActData(player.get_name(),ActData.REST)
    player.set_act(act_rest)
    return self.append_term()

  def move(self,direction):
    player = self.obj_pool.get_player()
    act_move = ActData(player.get_name(),ActData.MOVE,direction=direction)
    player.set_direction(direction)
    player.set_act(act_move)
    return self.append_term()

  def attack(self,direction=Direction.NO_DIR):
    player = self.obj_pool.get_player()
    if direction==Direction.NO_DIR:
      direction = player.get_direction()
    act_attack=ActData(player.get_name(),ActData.ATTACK,direction=direction)
    player.set_act(act_attack)
    return self.append_term()

  #行動を起こさずに、向きだけ変える
  def change_direction(self,direction):
    player = self.obj_pool.get_player()
    player.set_direction(direction)

  def use(self,item_id):
    player = self.obj_pool.get_player()
    act_useitem = ActData(player.get_name(),ActData.USE,item_id=item_id)
    player.set_act(act_useitem)
    return self.append_term()

  #プレイヤーの存在しているマップを開示
  def get_playermap(self):
    player = self.obj_pool.get_player()
    return self.map_pool[player.get_map()].get_mapdata(
        player.get_pos()-self.show_range,
        player.get_pos()+self.show_range
        )

  #プレイヤーが持つもろもろの情報を取得
  def get_playerinfo(self):
    player = self.obj_pool.get_player()
    debuglog(u'RogueCore#get_playerinfoは未実装')

  #プレイヤと同じ階層にいるオブジェクトを返す,
  def get_object(self):
    player = self.obj_pool.get_player()
    target_map = player.get_map()
    objects = self.obj_pool.get_item_with(lambda i:i.get_map()==target_map)
    ret_data=[]
    base = player.get_pos()-self.show_range
    for obj in objects:
      charcter_data = {'name':obj.get_name(),'pos':obj.get_pos()-base}
      ret_data.append(charcter_data)
    return ret_data

  #アイテムの入れ替えについてはどうする,
  #ゲーム内で処理するべきか、もう一個上の階層で処理すべきか
  def get_itemlist(self):
    pass

  #ゲームが最終状態になったかどうか
  def is_gameover(self):
    return False

  #アイテムを使用する
  def use_item(self,author,item):
    use_item = self.collection.pop(item)
    use_item.use_effect(author)

  #アイテムを装備する
  def equip_item(self,author,item):
    if item.equiped:
      outlog.debuglog(u'%sはすでに%sが装備している'%(item.name,item.owner.name))
    elif item.owner != author:
      outlog.debuglog(u'%sは%sを持っていない'%(author,item.name))
    else:
      item.equiped=True
      item.equip_effect(author)
      outlog.talklog(u'%sは%sを装備した'%s(author,item.name))

  #アイテムをはずす
  def unequip_item(self,author,item):
    if not item.equiped:
      outlog.debuglog(u'%sはまだ装備されていない')
    elif item.owner != author:
      outlog.debuglog(u'%sは%sを持っていない'%(author,item.name))
    else:
      item.equiped=False
      item.equip_effect(author)
      outlog.talklog(u'%sは%sをはずした'%s(author,item.name))

  #一人の所持物をフィールドへばらまく
  def scatter(self,owner,stage):
    for item in self.useableitem(owner):
      item.field_pos = stage[item.owner.field_name].randset()