a
    w^iíA  ã                   @   sä   d Z ddlZddlZddlZddlmZ ddlmZ ddlmZ ddlZe 	e
¡ZG dd„ dƒZG dd	„ d	ƒZG d
d„ deƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZdS )a[  
Core Game Model Classes

This file contains the core data model classes for BaoLife (formerly Project Lichun).
These classes define the fundamental game entities including players, characters,
locations, activities, schedules, and relationships.

Classes:
    - locationClass: Represents a location in the game world
    - ActivityRecord: Base class for tracking activities
    - EducationRecord: Tracks education activities (extends ActivityRecord)
    - dailyEvent: Represents a scheduled daily event
    - playerClass: Main player/game state container
    - personClass: Represents any character (player or NPC)
    - oneTimeEvent: Represents a one-time scheduled event
    - scheduleDays: Defines days/times for scheduled events
    - scheduler: Manages recurring schedules for characters
    - relationshipClass: Tracks relationships between characters
é    N)Údate)ÚSimpleNamespace)Úconfigc                   @   s   e Zd Zddd„ZdS )ÚlocationClassNc                 C   s(   || _ || _|| _d| _g | _d| _d S )NÚ ZlocationObject)ÚidÚtypeÚimageÚdescriptionZpeople)Úselfr   r   r	   © r   ú,/var/www/lichun.app/lichun/ws/core/models.pyÚ__init__%   s    zlocationClass.__init__)N©Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   $   s   r   c                   @   s   e Zd Zdd„ ZdS )ÚActivityRecordc                 C   s.   || _ || _|| _g | _d| _d | _d| _d S )Né2   ZBalanced)r   r   ZdateStartedZachievementsÚperformanceÚlevelÚfocus)r   r   r   r   r   r   r   r   /   s    zActivityRecord.__init__Nr   r   r   r   r   r   .   s   r   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚEducationRecordc                    s.   t ƒ  |jd|¡ || _d | _d | _d| _d S )NÚ	educationéK   )Úsuperr   r   ÚeducationLevelÚmajorÚminorZGPA)r   r   Úlocationr   ©Ú	__class__r   r   r   :   s
    zEducationRecord.__init__)r   r   r   r   Ú__classcell__r   r   r    r   r   9   s   r   c                   @   s   e Zd Zdd„ ZdS )Ú
dailyEventc                 C   s   || _ d| _d| _|| _d S )Nr   )ÚtimeÚtitleÚnamer   )r   r$   r   r   r   r   r   C   s    zdailyEvent.__init__Nr   r   r   r   r   r#   B   s   r#   c                   @   s   e Zd Zdd„ ZdS )ÚplayerClassc                 C   s  ddl m} ddlm}m}m}m}m} ddlm	}m
} ddlm}	 ddlm}
 d| _d| _d	| _d
| _d| _d| _tƒ | _tƒ | _g | _g | _g | _| j d¡ g | _tdd�| _tj | _!tj | _"d| _#d| _$d| _%t&t' (¡  )d¡ƒ| _*t&t' (¡  )d¡ƒ| _+|| j+ƒ| _,t-t' (¡  )d¡ƒ| _'d| _.d| _/d| _0t' (¡  1¡ | _2d	| _3d| _4d| _5d| _6d	| _7g d¢| _8|ƒ d | _9|ƒ d | _:|ƒ | _;|| j;ƒ| _<|ƒ | _=|ƒ | _>|ƒ | _?|	ƒ | _@|ƒ | _A|
ƒ | _Bg d¢| _Cg d¢| _DtEƒ | _Fd| jF_Gg | _Hg | _Ig | _Jd| _Kd S )Nr   )Ú
get_season)Ú
getSchoolsÚgetCollegesÚ	getMajorsÚ
getFocusesÚgetExtraCurriculars)ÚgetStoreItemsÚgetInAppPurchaseItems)ÚgetHealthConditions)ÚgetDateIdeasZinactiveÚ	connectedFZcreatingr   z(Welcome to BaoLife! Your journey awaits.)ZminutesOfflineé   z%jz%mú%m-%d©ÚCalmZStressedZ	ExhaustedZ	FulfilledZ	DepressedZHappyé   )ZbobZbunZcurlyZlong_not_too_longZshaggyZ
straight_1Z
straight_2)ZbuzzcutZ
short_flatZshort_roundZshort_wavedZsidesZplayerObject)LÚutils.helpersr(   Úeducation.education_managerr)   r*   r+   r,   r-   Úshop.shop_managerr.   r/   Úhealth.health_managerr0   Ú"relationships.relationship_managerr1   Ú
controllerÚ
connectionÚupdateClientÚstatusÚdayEventÚdeviceTokenÚsetÚeventsÚaskedQuestionsÚconversationsÚactiveDilemmasÚmessageQueueÚappendZ
messageLogr   ZofflineStatsr   ÚSPEED_DEFAULTÚ	gameSpeedÚpreviousGameSpeedZmessageEnergyCostÚticksZfpsÚintr   ÚtodayÚstrftimeÚ	dayOfYearÚmonthOfYearZseasonÚstrZminuteOfHourÚ	hourOfDayZ	dayOfWeekÚweekdayZweekDayÚweekendZweekDayTextZdaysSinceSchoolStartedZdaysUntilSchoolEndsZsummerVacationZmoodsÚelementary_schoolsÚhigh_schoolsÚcollegesÚmajorsZfocusesZ
storeItemsZinAppPurchasesÚhealthConditionsÚextraCurricularsZ	dateIdeasZfemale_hair_typesZmale_hair_typesÚpersonClassÚcr	   ÚrÚlÚrelDatar   )r   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r   r   r   r   K   sp    


zplayerClass.__init__Nr   r   r   r   r   r'   J   s   r'   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )r]   c           
   	   C   s8  ddl m} ddlm} ddlm}m}m}m} t	 
¡ j| _d| _g | _d| _|ƒ | _t dd¡}dd	g| | _d
dg| | _d| _d| _d| _d| _d| _d| _d| _d| _|| jƒ| _d| _d| _d| _ d| _!d| _"d| _#d| _$d| _%d| _&t dd¡| _'d| _(d| _)d| _*d| _+g d¢t dd¡ | _,g | _-d| _.d | _/d | _0d | _1d | _2d| _3d| _4d | _5d | _6d | _7g | _8g | _9g | _:g | _;g | _<g | _=d| _>t dd¡d | _?d| _@d| _Ag | _Bg | _Cg | _Dd| _Ed| _Fd| _GtHt Ig d¢¡|ƒ || ƒd|| ƒ|| ƒ|  J¡ d�| _Kd| _ddlLmM}mN}	 |ƒ | _O|	ƒ | _Pd S )Nr   )Úget_lastname)ÚgetWeightType)Úget_skin_colorÚget_hair_typeÚget_facial_hairÚget_accessoryZpersonObjectr   r7   ÚMaleÚFemaleÚHeÚSheFz*https://api.dicebear.com/7.x/avataaars/svgr6   é7   éd   é#   Úhome)ZfrugalZnormalZextravaganté   ÚNoneÚ	preschoolr   é   Úalive)ZblazerAndShirtZblazerAndSweaterZcollarAndSweaterZgraphicShirtZhoodieZshirtCrewNeckZshirtScoopNeckZ
shirtVNeckZAUBURN)ZclothingZ
skin_colorZhairZ
hair_colorZfacial_hairZ	accessoryZmouth)Úinitialize_messaging_traitsÚinitialize_messaging_patterns)QÚcharacter.character_managerrb   r;   rc   Úcharacter.appearancerd   re   rf   rg   ÚuuidÚuuid4Úhexr   r   ÚrelationshipsÚ	firstnameÚlastnameÚrandomÚrandintÚsexÚpronounÚmessageZageHoursÚageDaysÚageYearsr	   ÚmoodZmoneyÚweightZ
weightTypeZhungerZthirstÚenergyZ
calcEnergyZ
peakEnergyZprestigeZdiamondsÚstressÚsocialÚ	happinessr   ÚhealthZdeathChanceÚfamilyLevelZspendingHabitsÚactivityRecordsr   Úcurrent_educationÚelementary_schoolÚhigh_schoolÚcollegeÚactScoreÚ
occupationÚjobr   r   Ú
activitiesÚhabitsr[   ÚdislikesÚlikesÚitemsÚcanDriveÚaffinityÚfamiliarityr@   Z	dailyPlanÚ	schedulesÚoneTimeEventsZintraDayMessageÚtryingForChildÚpartnerr   ÚchoiceÚget_mouth_typeZavatar_settingsÚmessaging_styleru   rv   Úmessaging_traitsÚmessaging_patterns)
r   rb   rc   rd   re   rf   rg   Úindexru   rv   r   r   r   r   Š   s–    özpersonClass.__init__c                 C   s   | j dkrd| _nd| _d S )Nrh   rj   rk   )r�   r‚   )r   r   r   r   Ú
setPronounÞ   s    
zpersonClass.setPronounc                 C   s    dddddddœ}|  | jd¡S )z†
        Get mouth expression type based on current mood.

        Returns:
            str: Mouth expression type for avatar
        ÚdefaultZ	concernedZseriousZsmileZsadr5   )Úgetr†   )r   Zmood_mouth_mappingr   r   r   r£   ä   s    
ú
zpersonClass.get_mouth_typeN)r   r   r   r   r¨   r£   r   r   r   r   r]   ‰   s   Tr]   c                   @   s4   e Zd Zddddddi fdd„Zdd	„ Zd
d„ ZdS )ÚoneTimeEventFr   r   Nr   c                 C   sx   t  ¡ j| _|| _|| _|| _|| _|| _|| _	d| _
|| _|	| _|
| _| jdkrZ|| _n| jdkrt|| _|  ¡ | _d S )NZoneTimeEventObjectr   ÚdaysFromNow)ry   rz   r{   r   rƒ   r%   ÚdateTypeÚdateModifierÚhourr   r   ÚcompletionFuncÚcompletionArgsÚcompletionKwargsr   ÚfindDate)r   r%   rƒ   r   r   r¯   r­   r®   r°   r±   r²   r   r   r   r   û   s     

zoneTimeEvent.__init__c                 C   s~   | j dkr| jS | j dkrz| jrzddlm}m} |  jd | ¡ j¡7  _| | jd¡}||| jd� }| 	d¡| _| jS d S )	Nr   r¬   r   )ÚdatetimeÚ	timedeltaz-{}z%m-%d-%Y)Údaysr4   )
r­   r   r®   r´   rµ   ÚformatÚnowÚyearÚstrptimerP   )r   r´   rµ   Zdate_objectZnew_date_objectr   r   r   r³     s    
zoneTimeEvent.findDatec                 C   s&   | j r"| j |g| j¢R i | j¤Ž d S ©N)r°   r±   r²   )r   Úplayerr   r   r   Úrun_func  s    zoneTimeEvent.run_func)r   r   r   r   r³   r½   r   r   r   r   r«   ú   s
   ÿ
r«   c                   @   s   e Zd Zdd„ ZdS )ÚscheduleDaysc                 C   s   || _ || _|| _d S r»   )Z
daysOfWeekr¯   r   )r   r¶   r¯   r   r   r   r   r   !  s    zscheduleDays.__init__Nr   r   r   r   r   r¾      s   r¾   c                   @   s.   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
S )Ú	schedulerr3   c                 C   sN   |t  ¡ j | _|| _d| _|| _|| _|| _g d¢| _	d| _
|  |¡| _d S )Nr   )ÚonceÚweeklyÚdailyú
twice-weekúthrice-weekÚmorningÚ	afternoonÚeveningÚnightrV   rU   ÚworkdayÚschoolr’   Úworkro   ÚoutZschedulerObject)ry   rz   r{   r   r%   Z
executionsÚdurationr   Ú
conditionsZconditionsOptionsr   ÚfindWeekDaysr¶   )r   ÚpersonZplannamerÎ   r   rÍ   r   r   r   r   (  s    
zscheduler.__init__c                 C   s4  |dkr|dk o|dkS |dkr0|dk o.|dkS |dkrH|dkoF|dkS |dkr`|dko^|d	k S |d
krx|dkov|d	k S |dkr�|dkoŽ|d	k S |dkr |dkS |dkr°|dk S |dkrÊ|dk oÈ|j dkS |dkrÜd|jv S |dk� rðd|jv S |dk�rd|jv S |dk�rd|jv S |dk�r,d|jvS dS d S )NrÅ   é   é   rÆ   é   rÇ   é   rÈ   é   ÚafterSchoolé   Z	afterWorké   rV   r3   rU   rÉ   rË   rÊ   r’   ro   rÌ   F)r”   r   )r   Údayr$   rÐ   Ú	conditionr   r   r   ÚparseConditions5  s:    








zscheduler.parseConditionsc                 C   sn   t dt| jƒƒD ]X}| j| dkr| j| dkr| j| dkr| j| dkr|  |||| j| ¡r dS qdS )Nr   rÁ   rÂ   rÃ   rÄ   TF)ÚrangeÚlenrÎ   rÛ   )r   ZdayTestZhourTestrÐ   Úir   r   r   ÚcheckConditionsV  s    ÿÿzscheduler.checkConditionsc                 C   sà  d| j v rPtddƒD ]:}tddƒD ]*}|  |||¡r"tt|ƒ|dƒ    S q"qd| j v r¤tddƒD ]:}tddƒD ]*}|  |||¡rrtt|ƒ|dƒ    S qrqd�n8d| j v rüd}tddƒD ]2}tddƒD ]"}|  |||¡rÊ|t|ƒ } q¼qÊq¼t||dƒS d	| j v �rld}tddƒD ]H}tddƒD ]6}|  |||¡�r$t|ƒd
k �r$|t|ƒ } �q�q$�qt||d	ƒS d| j v �rÜd}tddƒD ]H}tddƒD ]6}|  |||¡�r”t|ƒdk �r”|t|ƒ } �q†�q”�q†t||dƒS dS )NrÀ   r7   é   r   rÕ   rÁ   rÂ   r   rÃ   rp   rÄ   é   F)rÎ   rÜ   rß   r¾   rS   rÝ   )r   rÐ   rÙ   r¯   Z	daysFoundr   r   r   rÏ   ^  sF    

 
zscheduler.findWeekDaysN)r3   )r   r   r   r   rÛ   rß   rÏ   r   r   r   r   r¿   '  s   
!r¿   c                   @   s"   e Zd Zddd„Zedd„ ƒZdS )ÚrelationshipClassNc                 C   s‚   t  ¡ j| _|| _|| _|| _|| _|| _|| _	g | _
|d urB|n
t dd¡| _g | _g | _g | _dddddddddddœ
| _d S )Nr7   rm   r   Úneutral)
Ú	verbosityZinquisitivenessZexpressivenessZresponsivenessZopennessZemoji_usageZ	formalityZresponse_timingZ
mood_stateZcurrent_topic_engagement)ry   rz   r{   r   Úperson1Úperson2Ú	startDateÚanniversaryDateÚrelationshipStatusÚrelationshipNotesÚ	eventsLogr   r€   ÚrelationshipScoreÚcommonInterestsÚ
challengesÚfuturePlansÚmessaging_modifiers)r   rå   ræ   rç   ré   rê   Úscorer   r   r   r   ‰  s.    özrelationshipClass.__init__c                 C   sj   | |d |d |d |d |d |d ƒ}|d |_ |d |_|d	 |_|d
 |_|d |_|d |_|S )Nrå   ræ   rç   ré   rê   rì   r   rè   rë   rí   rî   rï   )r   rè   rë   rí   rî   rï   )ÚclsÚdataÚrelationshipr   r   r   Ú	from_dict§  s    ú





zrelationshipClass.from_dict)N)r   r   r   r   Úclassmethodrõ   r   r   r   r   râ   ˆ  s   
râ   )Ú__doc__r´   ry   r   r   Útypesr   r   ÚloggingÚ	getLoggerr   Úloggerr   r   r   r#   r'   r]   r«   r¾   r¿   râ   r   r   r   r   Ú<module>   s$   

	?q&a