📄 gamelogic.cpp
字号:
item.pic_id = m_enumPointer->icon_id ;
item.description = m_enumPointer->description.c_str() ;
item.x = 38 ;
item.height = 60 ;
item.width = 210 ;
item.y += 50 ;
if ( m_enumPointer == m_focused_menu_item )
{
item.is_focus = true ;
}
else
{
item.is_focus = false ;
}
memcpy(pItem, &item, sizeof( SMenuItem ) ) ;
item.y += 28 ;
m_enumPointer++ ;
}
else
{
item.pic_id = -1 ;
item.description = NULL ;
item.x = 0 ;
item.y = 0 ;
memcpy(pItem, &item, sizeof( SMenuItem ) ) ;
reset_enum_pointer(m_enumPointer) ;
}
}
/*
* 菜单指针有没有到结尾
*/
bool CGameLogic::is_enum_item_end(const std::vector<SPropertyItem>::iterator& pos)
{
switch ( m_current_menu ) {
case MENU1:
return pos == m_gerneral_menu.end() ;
break;
case MENU2:
return pos == m_ActorManager->GetActiveActor().m_tools.end() ;
break;
case MENU3:
return pos == m_ActorManager->GetActiveActor().m_skills.end() ;
break ;
case MENU4:
return pos == m_gerneral_menu.end() ;
break ;
default:
break ;
}
return true ;
}
/*
* 菜单指针是不是到开头
*/
bool CGameLogic::is_enum_item_begin(const std::vector<SPropertyItem>::iterator& pos)
{
switch ( m_current_menu ) {
case MENU1:
return pos == m_gerneral_menu.begin() ;
break;
case MENU2:
return pos == m_ActorManager->GetActiveActor().m_tools.begin() ;
break;
case MENU3:
return pos == m_ActorManager->GetActiveActor().m_skills.begin() ;
break ;
case MENU4:
return pos == m_gerneral_menu.begin() ;
break ;
default:
break ;
}
return true ;
}
/*
* 重置枚举指针到开始
*/
void CGameLogic::reset_enum_pointer(std::vector<SPropertyItem>::iterator& pos)
{
pos = m_scroll_point ;
}
/*
* 当前人物调查地图
*/
void CGameLogic::Research()
{
CPlayer& Actor = m_ActorManager->GetActiveActor() ;
int ix = Actor.x ;
int iy = Actor.y ;
int new_event ;
/*
* 自身所在位置的调查
*/
int event_id = this->m_LogicMap[m_current_map][ix/granularity][iy/granularity] ;
/* 先根据地图处理地图事件 */
if ( event_id > 256 )
{
/* 调用触发事件 */
m_EventManager->Call_Event( event_id ) ;
/* 如果触发事件有后续事件,则改动逻辑地图 */
if ( (new_event = m_EventManager->Following_Event(event_id)) != -1)
{
this->m_LogicMap[m_current_map][ix/granularity][iy/granularity] = new_event ;
}
return ;
}
/*
* 自身周边的位置调查
*/
for (int dx = -1; dx <= 1; dx ++ )
{
for ( int dy = -1; dy <= 1; dy++ )
{
event_id = this->m_LogicMap[m_current_map][ix/granularity + dx ][iy/granularity + dy ] ;
if ( event_id >= 300 && event_id <= 310 )
{
/* 调用触发事件 */
m_EventManager->Call_Event( event_id ) ;
/* 修改地图 */
this->m_LogicMap[m_current_map][ix/granularity + dx][iy/granularity + dy] = 1 ;
return ;
}
}
}
/* 看看是否有用户关注的npc,如果有,引发菜单*/
if ( m_ActorManager->GetUserAttention() != NULL )
{
BringUpMenu( MENU4 ) ;
}
}
/*
* 对菜单选择的处理
*/
void CGameLogic::SelectItem()
{
CPlayer& Actor = m_ActorManager->GetActiveActor() ;
CPlayer* npc = NULL ;
vector<string> Argu ;
switch (m_current_menu)
{
case MENU1 : /* 人物属性菜单:回车不作为 */
break;
case MENU2 : /* 物品菜单:回车就使用物品 */
if ( !is_enum_item_end( m_focused_menu_item ) )
{
// 改变人物属性
Actor.ChangeProperty( m_focused_menu_item->name, m_focused_menu_item->val ) ;
// 从装备中删除节点
Actor.m_tools.erase( m_focused_menu_item ) ;
// 枚举指针恢复到第一条
m_enumPointer = Actor.m_tools.begin() ;
// 恢复焦点指针到第一位
m_focused_menu_item = m_enumPointer ;
/* 卷屏点也恢复到开始 */
m_scroll_point = m_enumPointer ;
}
break;
case MENU3 :
/* 三号菜单:招数菜单,选择招数进行攻击 */
if ( m_focused_menu_item->val != 999 )
{
/* actor状态变成攻击,播放攻击帧 */
Actor.Attack( m_focused_menu_item->description, m_npcFighter ) ;
}
else
{
Actor.TryEscape( m_npcFighter ) ;
}
m_GameState = NORMAL ;
m_current_menu = NOMENU ;
break ;
case MENU4 :
/* 四号菜单:人物调查菜单:选择不同的行为 */
switch ( m_focused_menu_item->val )
{
/* 和关注npc聊天 */
case 0 :
Argu.push_back(m_ActorManager->GetUserAttention()->name) ;
Argu.push_back(m_ActorManager->GetActiveActor().name) ;
m_GameState = NORMAL ;
m_current_menu = NOMENU ;
m_EventManager->Call_Event(m_ActorManager->GetUserAttention()->TalkScript(), &Argu) ;
break ;
/* 和关注的npc战斗 */
case 1 :
Argu.push_back(m_ActorManager->GetActiveActor().name) ;
Argu.push_back(m_ActorManager->GetUserAttention()->name) ;
m_GameState = NORMAL ;
m_current_menu = NOMENU ;
m_EventManager->Call_Event("fight", &Argu) ;
break ;
/* 啥也不作,关掉菜单 */
case 2 :
m_GameState = NORMAL ;
m_current_menu = NOMENU ;
break ;
/* 出人物生平简介 */
case 3 :
Argu.push_back(m_ActorManager->GetUserAttention()->name) ;
Argu.push_back(m_ActorManager->GetActiveActor().name) ;
m_GameState = NORMAL ;
m_current_menu = NOMENU ;
m_EventManager->Call_Event("show", &Argu) ;
break ;
default:
break ;
}
break ;
}
}
/*
* 卷动菜单:返回false如果卷动到底不作为
*/
bool CGameLogic::Scrolled( int waypoint )
{
if ( waypoint == DOWNWARD )
{
if ( !is_enum_item_end( m_scroll_point + MAXSCROLLITEM ) )
{
m_scroll_point++ ;
reset_enum_pointer( m_enumPointer ) ;
return true ;
}
}
else
{
if ( !is_enum_item_begin( m_scroll_point ) )
{
m_scroll_point-- ;
reset_enum_pointer( m_enumPointer ) ;
return true ;
}
}
return false ;
}
/*
* 查询战斗状态:不在战斗状态返回-1
*/
void CGameLogic::QueryBattleState(int* x, int* y, int* radius )
{
if ( !m_is_fighting )
{
*x = 0 ;
*y = 0 ;
*radius = -1 ;
}
else
{
*x = m_lightspot_x ;
*y = m_lightspot_y ;
*radius = m_lightspot_radius ;
}
}
/*
* 设定对战的npcActor
*/
void CGameLogic::StartFight(const std::string& name, const string& npc_name)
{
CPlayer& actor = this->m_ActorManager->GetActor(name) ;
CPlayer& npc = this->m_ActorManager->GetActor(npc_name) ;
m_is_fighting = true ;
this->m_npcFighter = npc_name ;
if ( m_walking_speed <= SLOWMODE )
{
SetLightSpot( (actor.x + npc.x) / 2, ( actor.y + npc.y ) / 2 , 90 ) ;
}
else
{
SetLightSpot( (actor.x + npc.x) / 2, ( actor.y + npc.y ) / 2 , 150 ) ;
}
}
void CGameLogic::EndFight(const string& name)
{
m_is_fighting = false ;
if ( name == "牛二" )
{
m_ActorManager->GetActiveActor().Die() ;
m_EventManager->Do_Event("Die_event") ;
return ;
}
// 从战斗脚本里退出
m_EventManager->Return_from_Event() ;
}
void CGameLogic::BringUpMenu(int id )
{
SPropertyItem item ;
switch (id)
{
/* 人物属性菜单 */
case MENU1 :
/* 拷贝菜单项 */
dump_property_menu() ;
m_enumPointer = m_gerneral_menu.begin() ;
m_focused_menu_item = m_gerneral_menu.begin() ;
m_scroll_point = m_enumPointer ;
Speak("菜单") ;
break;
/* 人物装备菜单 */
case MENU2 :
m_enumPointer = m_ActorManager->GetActiveActor().m_tools.begin() ;
m_focused_menu_item = m_ActorManager->GetActiveActor().m_tools.begin() ;
m_scroll_point = m_enumPointer ;
Speak("菜单") ;
break;
/* 战斗时人物技能菜单 */
case MENU3 :
m_enumPointer = m_ActorManager->GetActiveActor().m_skills.begin() ;
m_focused_menu_item = m_ActorManager->GetActiveActor().m_skills.begin() ;
m_scroll_point = m_enumPointer ;
break ;
/* 利用通用菜单的人物调查菜单 */
case MENU4 :
memset(&item, 0, sizeof(item) ) ;
m_gerneral_menu.clear() ;
item.icon_id = -1 ;
item.description = "<size=12> </p> 看看他到底是什么人" ;
item.val = 3 ;
m_gerneral_menu.push_back(item) ;
/* 出现在菜单上的描述 */
item.description = "<size=12> </p> 和他聊一聊吧" ;
/* 菜单的id,用于按键时判断菜单的选择项 */
item.val = 0 ;
m_gerneral_menu.push_back(item) ;
item.description = "<size=12> </p> 真不爽,打他丫的" ;
item.val = 1 ;
m_gerneral_menu.push_back(item) ;
item.description = "<size=12> </p> 不理他,走人" ;
item.val = 2 ;
m_gerneral_menu.push_back(item) ;
m_enumPointer = m_gerneral_menu.begin() ;
m_focused_menu_item = m_gerneral_menu.begin() ;
m_scroll_point = m_enumPointer ;
break ;
default:
throw( exception("try to use invalide menu!") ) ;
}
m_GameState = MENUING ;
m_current_menu = id ;
}
void CGameLogic::dump_property_menu()
{
CPlayer& actor = m_ActorManager->GetActiveActor() ;
SPropertyItem* property ;
SPropertyItem item ;
stringstream stream ;
string empty ;
memset(&item, 0, sizeof(item) ) ;
m_gerneral_menu.clear() ;
property = actor.Property("生命力") ;
item.icon_id = m_ActorManager->GetSimpleObj( property->name ).ResID ;
stream << "<size=13>生命力" << ": <color=255>" << property->val ;
property = actor.Property("生命力上限") ;
stream << "<color=16777215>/" << property->val << "</p>" << property->description ;
item.description = stream.str() ;
m_gerneral_menu.push_back(item) ;
stream.rdbuf()->str( empty ) ;
property = actor.Property("魔法力") ;
item.icon_id = m_ActorManager->GetSimpleObj( property->name ).ResID ;
stream << "<size=13>法术" << ": " << property->val ;
property = actor.Property("魔法力上限") ;
stream << "/" << property->val << "</p>" << property->description ;
item.description = stream.str() ;
m_gerneral_menu.push_back(item) ;
stream.rdbuf()->str( empty ) ;
property = actor.Property("攻击力") ;
item.icon_id = m_ActorManager->GetSimpleObj( property->name ).ResID ;
stream << "<size=13>攻击力" << ": " << property->val ;
property = actor.Property("攻击力上限") ;
stream << "/" << property->val << "</p>" << property->description ;
item.description = stream.str() ;
m_gerneral_menu.push_back(item) ;
stream.rdbuf()->str( empty ) ;
property = actor.Property("等级") ;
item.icon_id = m_ActorManager->GetSimpleObj( property->name ).ResID ;
stream << "<size=13>等级" << ":" << property->val << "</p>" << property->description ;
item.description = stream.str() ;
m_gerneral_menu.push_back(item) ;
stream.rdbuf()->str( empty ) ;
property = actor.Property("经验") ;
item.icon_id = m_ActorManager->GetSimpleObj( property->name ).ResID ;
stream << "<size=13>江湖经验" << ": " << property->val << "</p>" << property->description ;
item.description = stream.str() ;
m_gerneral_menu.push_back(item) ;
stream.rdbuf()->str( empty ) ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -